6

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

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

Where给出了在执行过程中可能会改变blar()的正确默认值。baz然而,这baz = baz if baz else ...条线让我觉得不雅。有没有其他人有更好的方法来避免一次性绑定默认函数参数?可通过 pip 安装的小型跨平台库是可接受的替代品。

4

4 回答 4

11

不,差不多就是这样。通常您进行测试,is None以便您可以安全地传递虚假值,例如0or""等​​。

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()
于 2013-06-06T11:04:45.890 回答
6

你可以更换

baz = baz if baz else blar()

baz = baz or blar()

如果您仍然对仅测试虚假值而不是None.

于 2015-02-06T11:54:47.830 回答
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
于 2013-06-06T12:34:13.917 回答
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)
于 2019-04-07T15:52:26.170 回答