python,没有方法重载,howto?

时间:2011-08-28 07:15:27

标签: python overloading

我想编写一个名为size()的函数,它接受文件名或文件名列表,并分别返回文件大小或大小总和。如何在没有python中没有的函数重载的情况下执行此操作?

感谢

苏雷什

4 个答案:

答案 0 :(得分: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)

答案 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