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的默认字符串设置为。那是一件事吗?
答案 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'