在python中是否有类似于ruby的|| =的表达式

Con*_*nan 5 ruby python expression

我在Ruby中遇到了一个有趣的表达:

a ||= "new"
Run Code Online (Sandbox Code Playgroud)

这意味着如果未定义a,则将"new"值分配给a; 否则,a将与它相同.在进行一些数据库查询时很有用.如果设置了该值,我不想触发另一个数据库查询.

所以我在Python中尝试了类似的思维方式:

a = a if a is not None else "new"
Run Code Online (Sandbox Code Playgroud)

它失败了.我认为这是因为你不能在Python中做"a = a",如果a没有定义.

所以我可以出来的解决方案是检查locals()和globals(),或者使用try ... except表达式:

myVar = myVar if 'myVar' in locals() and 'myVar' in globals() else "new"
Run Code Online (Sandbox Code Playgroud)

要么

try:
    myVar
except NameError:
    myVar = None

myVar = myVar if myVar else "new"
Run Code Online (Sandbox Code Playgroud)

我们可以看到,解决方案并不那么优雅.所以我想问一下,有没有更好的方法呢?

Bre*_*arn 5

使用未定义的变量作为"默认"是一点代码味道.正如您所发现的那样,它失败了,因为a = a如果尚不存在,则无法执行此操作.最好使用一些默认值(如None)初始化变量,然后检查它.所以你几乎找到了解决方案.唯一的问题是,您应该明确地初始化它,而不是将您的变量保留为未初始化并尝试使用"不存在"作为"缺失"值.所以,而不是这样做:

 # code with no initialization. . .
 a ||= blah
Run Code Online (Sandbox Code Playgroud)

做这个:

a = None
# code
if a is None:
    a = blah
Run Code Online (Sandbox Code Playgroud)


cas*_*evh 3

怎么样?

try:
    a = a
except NameError:
    a = "new"
Run Code Online (Sandbox Code Playgroud)

它不是很短,但清楚地(至少对我来说)解释了代码的意图。