我有一个 Python 函数,我正在对输入参数进行一些清理:
def func(param1, param2, param3):
param1 = param1 or ''
param2 = param2 or ''
param3 = param3 or ''
这迎合了作为None而不是空字符串传递的参数。是否有更简单/更简洁的方法来循环函数参数以将这样的表达式应用于所有参数。我的实际函数有九个参数。
我有一个 Python 函数,我正在对输入参数进行一些清理:
def func(param1, param2, param3):
param1 = param1 or ''
param2 = param2 or ''
param3 = param3 or ''
这迎合了作为None而不是空字符串传递的参数。是否有更简单/更简洁的方法来循环函数参数以将这样的表达式应用于所有参数。我的实际函数有九个参数。
对于装饰师来说,这看起来是一份不错的工作。这个怎么样:
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
(请注意,正如 Ned Batchelder 在他的回答中指出的那样,这仍然会弄乱函数签名。要解决这个问题,您可以使用Michele Simionato 的装饰器模块——我认为您只需要@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!