代码之家  ›  专栏  ›  技术社区  ›  Dave

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

  •  3
  • Dave  · 技术社区  · 6 年前

    问题” 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 回复  |  直到 6 年前
        1
  •  2
  •   hyper-neutrino    6 年前

    你可以做的一件事是使用 **kwargs 允许传递任何关键字参数的语法,如果有任何其他关键字不代表任何内容,则只会引发错误(或者,完全忽略它们,尽管这样会混淆用户,以防他们输入错误,并且不会发生错误)。如果完全忽略它们:

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

    基本上, **夸格斯 允许您传入任何关键字参数,如 foo(opt = 3) 把它们都写在口述里。缺点是你不能这样称呼它 foo(3) 。如果要按位置参数而不是关键字参数进行,可以执行以下操作 *args 它给出了参数的元组,但是您不能用指定的关键字来调用它。不幸的是,你不能两者兼得。

        2
  •  1
  •   Riolku    6 年前

    因为没有指定opt,所以它默认为none,如您所见。这为opt提供了一个定义,并且它不记住或保留它是默认值的任何属性,因此,这里的实现逻辑对于所需的结果是强制的。

        3
  •  1
  •   Reut Sharabani    6 年前

    也许只需在两个地方设置默认参数:

    DEFAULT_OPT = 5
    
    def foo(x1, opt=DEFAULT_OPT):
        bar(opt)
    
    def bar(opt=DEFAULT_OPT):
        print opt 
    

    否则使用 kwargs 我倾向于避免维护困难:

    def foo(x1, **kwargs):
        bar(**kwargs)
    
    def bar(opt=5, **_):
        print opt 
    
        4
  •  0
  •   dangee1705    6 年前

    foo 你打电话来 bar 具有 opt . 这将覆盖默认值 选择 里面 酒吧 .

        5
  •  0
  •   tangoal    6 年前

    none是python中的对象(请参见 here )这意味着它是一个有效的参数,当您不向BAR传递任何参数时。这就是它不触发默认参数值5的原因。在python中,我不知道还有什么可以做到的。