我想编写一个名为size()的函数,它接受文件名或文件名列表,并分别返回文件大小或大小总和。如何在没有python中没有的函数重载的情况下执行此操作?
感谢
苏雷什
答案 0 :(得分:5)
def size(*files):
for file in files:
print file
*files
是一种特殊的参数类型,它将所有参数都捕获到列表中。因此,如果您像这样致电size
:
size("file1.txt", "file2.xml")
files
将是一个包含file1.txt
和file2.xml
的列表。如果仅使用一个参数调用它,它仍将放在列表中。
要使用文件列表调用该函数,请使用相同的运算符,但在调用该函数时使用:
file_list = ["file1.txt", "file2.xml"]
size(*file_list)
答案 1 :(得分: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([])
答案 2 :(得分: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
)
答案 3 :(得分: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