循环功能参数用于完整性检查

时间:2009-01-03 17:41:09

标签: python function parameters arguments sanitization

我有一个Python函数,我正在对输入参数进行一些消毒:

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

这适用于作为 None 而不是空字符串传递的参数。是否有更简单/更简洁的方法来循环函数参数以将这样的表达式应用于所有这些。我的实际功能有九个参数。

3 个答案:

答案 0 :(得分:7)

对于装饰者来说这看起来不错。怎么样:

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's decorator module - 我认为你只需要添加一个{{1}在@decorator

的定义之前

答案 1 :(得分:2)

你可以做一些列表操作:

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)

然后你丢失了来自拥有真实参数名称的文档,以及更改默认值等的可能性。你仍然有一个非常难看的线来打开它们。

我说要写出九行,或者更改函数以减少参数:无论如何九都是很多!

答案 2 :(得分:-2)

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!