Python, без перегрузки метода, как? - PullRequest
3 голосов
/ 28 августа 2011

Я хочу написать функцию с именем size (), которая будет принимать либо имя файла, либо список имен файлов и возвращать размер файла или сумму его размеров соответственно. Как это сделать без перегрузки функции, которая недоступна в python?

спасибо

Суреш

Ответы [ 4 ]

5 голосов
/ 28 августа 2011
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)
3 голосов
/ 28 августа 2011

Я рекомендую использовать внутреннюю перегрузку, так как она наиболее интуитивно понятна для пользователя функции

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([])
1 голос
/ 28 августа 2011

Я полагаю, это то, что вы просили.Тем не менее, я думаю, что это плохой выбор дизайна.Запомните дзен 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
1 голос
/ 28 августа 2011
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) к этой функции в будущем

...