2011-08-28 39 views
3

我想写一个名为size()的函数,它将接受文件名或文件名列表,并分别返回文件的大小或大小的总和。如何做到这一点,而没有在python中没有的函数重载?python,没有方法重载,howto?

感谢

苏雷什

+0

@eyquem应鼓励用户使用正确的英语语法和拼写,但你的态度是相当对抗的。不要抨击新用户,只是告诉他们对他们的期望。 –

+0

@保罗,感谢您的支持。我是这里的新用户。我完全理解必须使用正确的英语语法和拼写。但如果这些问题会受到语言结构的头发分裂分析的影响,我恐怕会阻止很多...... – suresh

+0

@suresh好吧,谢谢你保持这么热情。我很欣赏那些能够承认自己小缺点的人。因此,我可以欣赏我自己,因为我犯了很多错误。 - 我会删除我所有的评论,你会像雪一样白:-)开始在stackoverflow。如果你用他的**改正他们的**,我甚至会提出你的问题! – eyquem

回答

3

我建议使用内部超载,因为它是最直观的,用户的输入参数功能

import os 

def file_size(files): 

    if isinstance(files, str): 
     files = [files] # enlist 

    size = 0 
    for f in files: 
     size += os.path.getsize(f) 

    return size 


if __name__ == '__main__': 
    print file_size(__file__) 
    print file_size([__file__, __file__]) 
    print file_size([]) 
+0

不会不必要地保存所有大小值在列表大小,因此浪费记忆,而我只需要他们的总和大小?我不确定我的想法是否正确,因为我是Python新手...... – suresh

+0

我看到“大小之和” - 我不明白由于错字导致的问题。是的,而不是保留所有的大小,可以保持总和。在这种情况下,batch_call变量不是有用的,因为如果输入是字符串或列表,输出的类型不会改变 – selvin

+0

@selvin _“我不明白由于输入错误导致的问题”_。我也不知道这是我无法回答的原因。 – eyquem

5
def size(*files): 
    for file in files: 
     print file 

*files是一种特殊的参数类型,这将捕获所有的参数到一个列表。因此,如果你调用size这样的:

size("file1.txt", "file2.xml") 

files将包含file1.txtfile2.xml列表。如果你只用一个参数来调用它,它仍然会被放置在一个列表中。

调用函数与文件的列表,使用相同的操作,但用在当你调用该函数:

file_list = ["file1.txt", "file2.xml"] 
size(*file_list) 
+0

这是不正确的。 OP希望发送一个字符串或一个字符串列表。您的代码假设有多个参数... – gahooa

+2

@gahooa,此方法允许您发送单个参数和参数列表。你想说啥? –

+0

也许我从字面上理解了'list'这个词,但是当我阅读原始文章时,它说他希望'size(string_with_filename)'或'size(list_of_filenames)'。糟糕的设计选择。 – gahooa

1
def size(files): 
    # convert to a list if only one item given 
    if not hasattr(files,'__iter__'): 
     files = [ files ] 

    for fname in files: 
     ...do something with fname... 

编辑:此方案的优点是,你可以在未来添加更多参数(例如min_mtime)到此功能

+0

@Holzner,我刚才发现'hasattr('any_string','__ iter __')'是'True'。所以人们需要使用'isinstance'或类似的东西.... – suresh

+0

事实上,我意识到它在python 3中返回'True',而在python 2.6中返回'False' ... –

1

我相信这是您要求的。不过,我认为这是一个糟糕的设计选择。记住蟒蛇的禅...

In the face of ambiguity, refuse the temptation to guess. 
There should be one-- and preferably only one --obvious way to do it. 

在概念上,只是检查它是什么类型的

def size(arg): 
    if isinstance(arg, str): 
     retval = ... #get size of arg 
     return retval 
    else: 
     retval = [] 
     for f in arg: 
      retval.append(...) #get size of each file 
     return retval