Параметры функции цикла для проверки работоспособности - PullRequest
3 голосов
/ 03 января 2009

У меня есть функция Python, в которой я выполняю некоторую очистку входных параметров:

def func(param1, param2, param3):
    param1 = param1 or ''
    param2 = param2 or ''
    param3 = param3 or ''

Это обслуживает аргументы, передаваемые как Нет , а не пустые строки. Существует ли более простой / краткий способ зацикливания параметров функции, чтобы применить такое выражение ко всем из них. Моя фактическая функция имеет девять параметров.

Ответы [ 3 ]

7 голосов
/ 03 января 2009

Это похоже на хорошую работу для декоратора. Как насчет этого:

def sanitized(func):
    def sfunc(*args, **kwds):
        return func(*[arg or '' for arg in args],
                    **dict((k, v or '') for k,v in kwds.iteritems()))
    sfunc.func_name = func.func_name
    sfunc.func_doc = func.func_doc
    return sfunc

Вы бы использовали это в своей функции следующим образом:

@sanitized
def func(param1, param2, param3):
    print param1, param2, param3

Тогда параметры будут заменены пустой строкой, если они ложны:

>>> func('foo', None, 'spam')
foo  spam

(Обратите внимание, что это все равно испортит сигнатуру функции, на что указывает Нед Батчелдер в своем ответе. Чтобы исправить это, вы можете использовать Модуль декоратора Микеле Симионато - думаю, вам просто нужно добавить @decorator до определения sanitized)

2 голосов
/ 03 января 2009

Вы можете сделать некоторые манипуляции со списком:

def func(param1, param2, param3):
    param1, param2, param3 = map(lambda x: x or '', (param1, param2, param3))

но я не уверен, что это лучше, чем просто записать девять строк, поскольку, как только вы получите девять параметров, это ужасно длинная строка.

Вы можете изменить объявление функции:

def func(*args):
    param1, param2, param3 = map(lambda x: x or '', args)

но затем вы теряете документацию, связанную с наличием реальных имен параметров, а также возможностью изменения значений по умолчанию и т. Д. И у вас все еще есть довольно неясная линия для их распаковки.

Я говорю, запишите девять строк или измените функцию, чтобы у нее было меньше параметров: в любом случае девять - это много!

0 голосов
/ 03 января 2009
def func(x='', y='', z='hooray!'):
    print x, y, z

In [2]: f('test')
test  hooray!

In [3]: f('test', 'and')
test and hooray!

In [4]: f('test', 'and', 'done!')
test and done!
...