如何在python中强制使用默认参数

时间:2017-08-25 00:05:16

标签: python

TLDR:我想将一个参数传递给一个强制函数使用它的函数的函数,就像我没有提供任何参数一样。

例如

def foo(string = "DEFAULT PARAM"):
    print(string)

def bar(string = None):
    foo(string)

bar()            # Should print "DEFAULT PARAM", but instead prints None
bar("Hello!")    # Should print "Hello!"

我知道有很多解决方法,例如:

def bar(string = None):
    foo() if string is None else foo(string)

但我希望有更优雅的东西。像某种默认关键字一样,我可以将bar的默认字符串设置为。那是一件事吗?

4 个答案:

答案 0 :(得分:5)

我在Python中多次遇到这种烦恼(主要是在使用argparse时,它使用空值填充省略的选项,而不是仅从命名空间中省略它们)。

如果您希望明确地将None作为值传递,并将其视为完全省略,则最好:

def foo(string=None):
    if string is None:
        string = "DEFAULT PARAM"
    print(string)

def bar(string=None):
    foo(string)

相反的烦恼是当None是有效值时,您实际上有时需要明确地传递它。在这种情况下,这是最好的:

sentinel = object()

def foo(arg=sentinel):
    if arg is sentinel:
        arg = "DEFAULT PARAM"
    print(arg)

def bar(arg=None):
    foo(arg)

答案 1 :(得分:4)

不,您可以传递的值不会触发使用默认值代替传递的值。传递值会将该值绑定到形式参数period。

答案 2 :(得分:0)

你做不到。我相信在None是可接受的值传递的情况下,一直在讨论添加新的单例。据我所知,这些提议一直被击落,因为python已经有很多单身人士了:

NotImplemented
Ellipsis
None

您提出的解决方案是可变默认参数的典型解决方案,因此将其用于其他情况也是有意义的(如本例)。显然有时None是合理的值 - 在这种情况下,选择另一个单身或创建自己的(通过object())。

你最后的追索权(即当你无法控制这个功能,当你只是不能调用函数而不传递参数时)是parse the default value from the function itself并通过它。

显然,这种方法应该谨慎使用: - )

答案 3 :(得分:-1)

def foo(string = 'default'):
    print(string)

def bar(**kwargs):
    foo(**kwargs)

bar() # prints 'default'
bar(string = 'baz') # prints 'baz'