Pythonic方式在条件上传递关键字参数

时间:2011-12-31 04:12:23

标签: python

有更多的pythonic方法吗?

if authenticate:
    connect(username="foo")
else:
    connect(username="foo", password="bar", otherarg="zed")

4 个答案:

答案 0 :(得分:18)

  1. 您可以将它们添加到这样的kwargs列表中:

    connect_kwargs = dict(username="foo")
    if authenticate:
       connect_kwargs['password'] = "bar"
       connect_kwargs['otherarg'] = "zed"
    connect(**connect_kwargs)
    

    当您有一组可以传递给函数的复杂选项时,这有时会很有用。在这个简单的例子中,我认为你拥有的更好,但这可以被认为是更多pythonic ,因为它不会像OP一样重复username="foo"两次。

  2. 也可以使用这种替代方法,但只有在知道默认参数的情况下才能使用。由于重复的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'}
))