Параметры функции контура для проверки работоспособности

StackOverflow https://stackoverflow.com/questions/409449

Вопрос

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

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

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

Это было полезно?

Решение

Похоже, это хорошая работа для декоратора.Как насчет этого:

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)

Другие советы

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

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)

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

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

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!
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top