Параметры функции контура для проверки работоспособности
-
03-07-2019 - |
Вопрос
У меня есть функция 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!