我需要具有必须在函数运行时设置的默认参数的函数(例如空列表,从其他参数派生的值或从数据库中获取的数据),我目前正在使用以下模式来处理此问题:
def foo(bar, baz=None):
baz = baz if baz else blar()
# Stuff
blar()
给出了baz
的正确默认值,该默认值可能会在执行期间发生变化。然而,baz = baz if baz else ...
行让我感到不雅。有没有其他人有更好的方法来避免默认函数参数的一次性绑定?可以通过pip安装的小型跨平台库是可接受的替代品。
答案 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)