【问题标题】:Loop function parameters for sanity check完整性检查的循环函数参数
【发布时间】:2010-09-29 09:29:58
【问题描述】:

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

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

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

【问题讨论】:

  • 鉴于目前的工作答案看起来多么复杂,我认为一个很好的问题是为什么这很重要?你在关心 None 和 '' 之间区别的函数中调用了什么?
  • 嗯,我前一阵子写的(今天想整理一下)。也许我需要重新审视为什么我认为这是必要的。

标签: python function parameters arguments sanitization


【解决方案1】:

这对于装饰师来说似乎是一份不错的工作。这个怎么样:

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--我认为您只需要在定义之前添加一个 @decorator sanitized)

【讨论】:

  • 我认为你也需要传递 kwargs:**dict((k, arg or '') for k, arg in kwargs.items()))
  • 是的,这是迄今为止最好的解决方案(除了将原始代码重构为不需要它。)
  • 您可能应该将 arg or '' 更改为 '' if arg is None else arg 或类似的东西,以防 arg 为 0 或 {} 或非无。
【解决方案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)

但是你失去了来自拥有真实参数名称的文档,以及更改默认值的可能性等。而且你仍然有一条非常丑陋的线来解压它们。

我说写出九行,或者将函数更改为具有更少的参数:无论如何,九行有点多!

【讨论】:

    【解决方案3】:
    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!
    

    【讨论】:

      猜你喜欢
      • 2020-06-10
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多