python,没有方法重载,如何?

python,没有方法重载,如何?,python,overloading,Python,Overloading,我想编写一个名为size()的函数,它将接受文件名或文件名列表,并分别返回文件的大小或大小之和。如何在没有函数重载(python中不可用)的情况下实现这一点 谢谢 苏雷什 *files是一种特殊的参数类型,它将捕获列表中的所有参数。因此,如果您这样调用size: size("file1.txt", "file2.xml") files将是一个包含file1.txt和file2.xml的列表。如果只使用一个参数调用它,它仍将被放置在列表中 要使用文件列表调用函数,请使用相同的运算符,但在调用函数

我想编写一个名为size()的函数,它将接受文件名或文件名列表,并分别返回文件的大小或大小之和。如何在没有函数重载(python中不可用)的情况下实现这一点

谢谢

苏雷什

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

size("file1.txt", "file2.xml")
files
将是一个包含
file1.txt
file2.xml
的列表。如果只使用一个参数调用它,它仍将被放置在列表中

要使用文件列表调用函数,请使用相同的运算符,但在调用函数时使用:

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

编辑:此变体的优点是,您可以在将来向此函数添加更多参数(例如
min\mtime

我相信这就是您所要求的。然而,我认为这是一个糟糕的设计选择。还记得python的禅宗吗

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

我建议在内部使用重载,因为这对函数的用户来说是最直观的

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([])

这是不对的。OP希望发送字符串或字符串列表。您的代码假定有多个参数…@gahooa,此方法允许您发送单个参数和参数列表。你的意思是什么?也许我把
列表
这个词看得太字面了,但当我读到原始帖子时,它说他想要
大小(带文件名的字符串)
大小(文件名列表)
。一个糟糕的设计选择。我要说的是,这个答案中的代码是一个很好的设计,我建议@suresh使用它。在这个方法中,如果参数是一个列表,我必须在它前面加一个*对吗?但是我不知道输入是否是一个列表,是否是先验的。所以我想这是行不通的。当我只需要它们的大小之和时,我是否会不必要地保留列表大小中的所有大小值,从而浪费内存?我不确定我的想法是否正确,因为我是Python新手……我看到了“大小之和”——由于打字错误,我不理解这个问题。是的,与其保留所有尺寸,还可以只保留总数。在这种情况下,batch_call变量没有用处,因为如果输入是字符串或字符串,则输出的类型不会改变list@selvin“由于打字错误,我不理解这个问题。”。我也没有。这就是我无法回答的原因。@eyquem用户应该被鼓励使用正确的英语语法和拼写,但你的态度相当对抗。不要抨击新用户,告诉他们对他们的期望。@Paul,谢谢你的支持。我是这里的新用户。我完全理解必须使用正确的英语语法和拼写。但是,如果这些问题会受到语言结构令人毛骨悚然的分析,恐怕会让许多人望而却步……@suresh好吧,谢谢你这么客气。我欣赏那些能够承认自己小缺点的人。因此我可以欣赏自己,因为我犯了很多错误我会删除我所有的评论,你会像雪一样洁白:-)从stackoverflow开始。如果你用它纠正他们的错误,我甚至会投你的一票@就我的英语知识而言,我看不出它是否更好。这就是为什么我没有早些改变它。但我想它更精确。犯错是人权吗?但我们的努力应该是尽可能地减少它……(从其他大师那里学到的)@suresh我想“接受一个文件名或一个文件名列表,并分别返回其大小或大小之和”,但我不会继续玩下去,就好像我是一个游戏大师一样English@Holzner,我刚刚发现,
hasattr('any_string','uu iter_uu')
True
。因此需要使用
isinstance
或类似的东西……事实上,我意识到它在Python3中返回
True
,但在Python2.6中返回
False
。。。
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
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([])