首页 > 解决方案 > 有没有办法通过两个函数传递可选参数?

问题描述

问题“有没有办法将可选参数传递给函数? ”描述了如何使用默认关键字参数。

我有两个函数,其中一个调用另一个,我希望能够检测是否使用可选参数调用了外部函数:

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() 可以用特殊的逻辑编写来检测是否传递了可选参数,但是有没有一种 Python 的方式来传递一个可选参数,并且在不使用额外逻辑的情况下保留其可选性?

def foo2(x1, opt=None):
    if opt is None:
        bar()
    else:
        bar(opt)

默认值必须在内部函数中定义,因为它可以直接调用。我还可以为内部函数和外部函数定义相同的默认值,但是当默认值比整数更复杂时,这有点难看(违反 DRY)。

标签: python

解决方案


您可以做的一件事是使用**kwargs语法来允许传递任何关键字参数,然后如果有任何额外的关键字没有任何意义,则只引发错误(或者,只是干净地忽略它们,尽管这会混淆用户,以防他们打错并且没有发生错误)。在完全忽略它们的情况下:

def foo(x1, **kwargs):
    if "opt" in kwargs:
        bar(kwargs["opt"])
    else:
        bar()

基本上,**kwargs您可以传入任何关键字参数,例如foo(opt = 3) 并将它们全部放在字典中。这样做的缺点是您不能将其称为foo(3). 如果你想通过放置参数而不是关键字参数,你可以这样做*args,给出一个参数的元组,但是你不能用指定的关键字调用它。不幸的是,你不能两者都做。


推荐阅读