问题" Is there a way to pass optional parameters to a function?"描述了如何使用默认关键字参数。
我有两个函数,其中一个调用另一个函数,我希望能够检测是否使用可选参数调用了外部函数:
def foo(x1, opt=None):
bar(opt)
def bar(opt=5):
print opt
if __name__ == '__main__':
foo(1) # Should print 5, actually prints None
foo(2, opt=3) # Does print 3
打印:
None
3
Foo()可以用特殊的逻辑来编写,以检测是否传递了可选参数,但是是否有一种pythonic方法来传递一个可选参数,并保留其可选性而不使用额外的逻辑?
def foo2(x1, opt=None):
if opt is None:
bar()
else:
bar(opt)
默认必须在内部函数中定义,因为它可以直接调用。我也可以为内部和外部函数定义相同的默认值,但是当默认值比整数更复杂时,它有点难看(违反DRY)。
答案 0 :(得分:2)
您可以做的一件事是使用**kwargs
语法允许传递任何关键字参数,然后如果有任何额外的关键字不具有任何意义,则只会引发错误(或或者,只是干净地忽略它们,尽管这会使用户感到困惑,以防他们输错并且不会发生错误)。如果干净地忽略它们:
def foo(x1, **kwargs):
if "opt" in kwargs:
bar(kwargs["opt"])
else:
bar()
基本上,**kwargs
允许您传递任何关键字参数,例如foo(opt = 3)
,并将它们全部放入dict中。这样做的缺点是你不能像foo(3)
那样称呼它。如果你想通过放置参数而不是关键字参数,你可以*args
给出一个参数元组,但是你无法用指定的关键字调用它。不幸的是,你不能两者兼顾。
答案 1 :(得分:1)
由于未指定opt,因此您会看到默认为None。这给了opt的定义,并且它不记得或保留任何属性它是默认值,所以不,这里实现逻辑对于所需的结果是必需的。
答案 2 :(得分:1)
也许只需在两个地方设置默认参数:
kwargs
否则使用def foo(x1, **kwargs):
bar(**kwargs)
def bar(opt=5, **_):
print opt
我倾向于避免难以维护:
{{1}}
答案 3 :(得分:0)
在foo
中,您使用bar
致电opt
。这会覆盖opt
内的bar
的默认值。
答案 4 :(得分:0)
没有Python中的对象(参见here)这意味着当你将None传递给bar时它是一个有效的参数。这就是为什么它不会触发默认参数值5.我不知道Python中的任何其他内容,可能会这样做。