有更多的pythonic方法吗?
if authenticate:
connect(username="foo")
else:
connect(username="foo", password="bar", otherarg="zed")
答案 0 :(得分:18)
您可以将它们添加到这样的kwargs列表中:
connect_kwargs = dict(username="foo")
if authenticate:
connect_kwargs['password'] = "bar"
connect_kwargs['otherarg'] = "zed"
connect(**connect_kwargs)
当您有一组可以传递给函数的复杂选项时,这有时会很有用。在这个简单的例子中,我认为你拥有的更好,但这可以被认为是更多pythonic ,因为它不会像OP一样重复username="foo"
两次。
也可以使用这种替代方法,但只有在知道默认参数的情况下才能使用。由于重复的if
条款,我也不认为它是非常“pythonic”。
password = "bar" if authenticate else None
otherarg = "zed" if authenticate else None
connect(username="foo", password=password, otherarg=otherarg)
答案 1 :(得分:3)
在这种情况下OP的版本实际上是好的,其中无条件参数的数量与条件参数的数量相比较低。这是因为只有无条件参数必须在if-else结构的两个分支中重复。但是,我经常遇到相反的情况,即无条件参数的数量高于条件参数的数量。
这就是我使用的:
connect( username="foo",
**( dict( password="bar", otherarg="zed") if authenticate else {} ) )
答案 2 :(得分:0)
我以为我会把帽子扔进戒指:
authenticate_kwargs = {'password': "bar", 'otherarg': "zed"} if authenticate else {}
connect(username="foo", **authenticate_kwargs)
答案 3 :(得分:-2)
或者,更简洁:
connect(**(
{'username': 'foo', 'password': 'bar', 'otherarg': 'zed'}
if authenticate else {'username': 'foo'}
))