python函数中的动态默认参数

时间:2013-06-06 11:03:12

标签: python

我需要具有必须在函数运行时设置的默认参数的函数(例如空列表,从其他参数派生的值或从数据库中获取的数据),我目前正在使用以下模式来处理此问题:

def foo(bar, baz=None):
    baz = baz if baz else blar()
    # Stuff

blar()给出了baz的正确默认值,该默认值可能会在执行期间发生变化。然而,baz = baz if baz else ...行让我感到不雅。有没有其他人有更好的方法来避免默认函数参数的一次性绑定?可以通过pip安装的小型跨平台库是可接受的替代品。

4 个答案:

答案 0 :(得分:9)

不,这就是它。通常您会测试is None,以便安全地传递0""等虚假值。

def foo(bar, baz=None):
    baz = baz if baz is not None else blar()

老式的方式是两个班轮。有些人可能更喜欢这个

def foo(bar, baz=None):
    if baz is None:
        baz = blar()

答案 1 :(得分:3)

您可以替换

baz = baz if baz else blar()

baz = baz or blar()

如果您仍然对仅测试假值而不是None感到满意。

答案 2 :(得分:0)

可能有效的快速和肮脏的示例实现:

class DynDefault(object):
    def __init__(self, callback):
        self.callback = callback
    def __call__(self):
        return self.callback()

def dyn_default(func):
    def wrapper(*args, **kw):
        args = [arg() for arg in args if isinstance(arg, DynDefault) else arg]
        for k, v in kw.items():
            if isinstance(v, DynDefault):
                kw[k] = v()
        return func(*args, **kw)
    return wrapper

@dyn_default
def foo(bar, baaz=DynDefault(blar)):
    # problem solved

答案 3 :(得分:0)

您可以执行以下操作:

def getArg():
  try:
      return arg
  except NameError:
      return 0

def foo(x, y=getArg):
    y = y()
    print(y)

foo(1) # Prints 0 (Default)

arg = 7 # Set by argparse?

foo(2)           # Prints 7 (Dynamic global)
foo(3, lambda:9) # Prints 9 (Dynamic passed)