python函数中的动态默认参数

问题描述 投票:5回答:4

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

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

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

python
4个回答
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()

3
投票

你可以替换

baz = baz if baz else blar()

baz = baz or blar()

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


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

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)
© www.soinside.com 2019 - 2024. All rights reserved.