有没有办法通过两个函数传递可选参数?

时间:2018-05-23 19:05:26

标签: python

问题" 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)。

5 个答案:

答案 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中的任何其他内容,可能会这样做。