有一个函数接受可选参数。
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
这样调用它的情况,它们要么包含要传递的值,要么是 无
。但即使函数处理 p2=None
,我还是希望它使用其默认值 "bar"
。
也许这措辞令人困惑,所以让我改写一下:
If
myp2 is None
, callalpha("FOO")
. Else, callalpha("FOO", myp2)
.
区别是相关的,因为 alpha("FOO", None)
与 alpha("FOO")
的结果不同。
我怎样才能简明地(但可读地)做出这种区分?
一种可能性通常是 check for None within alpha
,这是值得鼓励的,因为这会使代码更安全。但是假设 alpha
用于其他地方,它实际上应该像处理 None
一样。
我想在调用方处理这个问题。
一种可能性是区分大小写:
if myp2 is None:
alpha("FOO")
else:
alpha("FOO", myp2)
但是当有多个这样的参数时,这很快就会变成很多代码。 (指数,2^n)
另一种可能性是简单地执行alpha("FOO", myp2 or "bar")
,但是这需要我们知道默认值。通常,我可能会采用这种方法,但我以后可能会更改 alpha
的默认值,然后需要手动更新此调用,以便仍然使用(新)默认值调用它值(value)。
我使用的是 python 3.4,但如果您的答案能够提供适用于任何 python 版本的好方法,那将是最好的。
这个问题在技术上已经结束了,但我再次改写了一些要求,因为第一个答案确实掩盖了这一点:
我希望 alpha
的行为通常保留其默认值 "foo", "bar"
,因此(可能)不是更改 alpha 的选项
本身。
换句话说,假设 alpha
在其他地方被用作 alpha("FOO", None)
其中输出 FOO,None
是预期的行为。
最佳答案
将参数作为字典中的 kwargs 传递,从中过滤出 None
值:
kwargs = dict(p1='FOO', p2=None)
alpha(**{k: v for k, v in kwargs.items() if v is not None})
关于python - 如果它们为 None,则调用不带可选参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52494128/