有一个函数接受可选参数。
def alpha(p1="foo", p2="bar"):
print('{0},{1}'.format(p1, p2))
让我重复一下当我们以不同方式使用该函数时会发生什么:
>>> alpha()
foo,bar
>>> alpha("FOO")
FOO,bar
>>> alpha(p2="BAR")
foo,BAR
>>> alpha(p1="FOO", p2=None)
FOO,None
现在考虑我想调用它的情况 alpha("FOO", myp2)
和 myp2
将包含要传递的值,或者是 None
但即使该函数处理 p2=None
,我还是希望它使用其默认值 "bar"
代替。
也许这样的措辞令人困惑,所以让我重新措辞:
如果
myp2 is None
,调用alpha("FOO")
。否则,调用alpha("FOO", myp2)
。
区别是相关的,因为 alpha("FOO", None)
的结果与 alpha("FOO")
不同。
我怎样才能简洁地(但可读地)做出这种区分?
一种可能性通常是 在 alpha
中检查 None ,我们鼓励这样做,因为这会使代码更安全。但是假设 alpha
被用在它实际应该处理 None
的其他地方。
我想在调用者端处理它。
一种可能性是区分大小写:
if myp2 is None:
alpha("FOO")
else:
alpha("FOO", myp2)
但是当有多个这样的参数时,这很快就会变成很多代码。 (指数,2^n)
另一种可能性是简单地做 alpha("FOO", myp2 or "bar")
,但这 _需要我们知道默认值_。通常,我可能会采用这种方法,但稍后我可能会更改 alpha
的默认值,然后需要手动更新此调用以便仍然使用(新)默认值调用它.
我使用的是 python 3.4,但最好是您的答案可以提供适用于任何 python 版本的好方法。
这个问题在技术上已经在这里完成了,但我再次改写了一些要求,因为第一个答案确实掩盖了这一点:
我希望 alpha
的行为及其默认值 "foo", "bar"
一般保留,所以它(可能)不是更改的选项 alpha
再换句话说,假设 alpha
在其他地方被用作 alpha("FOO", None)
其中输出 FOO,None
是预期的行为。
原文由 lucidbrot 发布,翻译遵循 CC BY-SA 4.0 许可协议
从字典中将参数作为 kwargs 传递,从中过滤出
None
值: