我想写一个名为size()的函数,它将接受文件名或文件名列表,并分别返回文件的大小或大小的总和。如何做到这一点,而没有在python中没有的函数重载?python,没有方法重载,howto?
感谢
苏雷什
我想写一个名为size()的函数,它将接受文件名或文件名列表,并分别返回文件的大小或大小的总和。如何做到这一点,而没有在python中没有的函数重载?python,没有方法重载,howto?
感谢
苏雷什
我建议使用内部超载,因为它是最直观的,用户的输入参数功能
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([])
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)
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
)到此功能
@Holzner,我刚才发现'hasattr('any_string','__ iter __')'是'True'。所以人们需要使用'isinstance'或类似的东西.... – suresh
事实上,我意识到它在python 3中返回'True',而在python 2.6中返回'False' ... –
我相信这是您要求的。不过,我认为这是一个糟糕的设计选择。记住蟒蛇的禅...
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
@eyquem应鼓励用户使用正确的英语语法和拼写,但你的态度是相当对抗的。不要抨击新用户,只是告诉他们对他们的期望。 –
@保罗,感谢您的支持。我是这里的新用户。我完全理解必须使用正确的英语语法和拼写。但如果这些问题会受到语言结构的头发分裂分析的影响,我恐怕会阻止很多...... – suresh
@suresh好吧,谢谢你保持这么热情。我很欣赏那些能够承认自己小缺点的人。因此,我可以欣赏我自己,因为我犯了很多错误。 - 我会删除我所有的评论,你会像雪一样白:-)开始在stackoverflow。如果你用他的**改正他们的**,我甚至会提出你的问题! – eyquem