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)
我们可以看到,解决方案并不那么优雅.所以我想问一下,有没有更好的方法呢?
使用未定义的变量作为"默认"是一点代码味道.正如您所发现的那样,它失败了,因为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)
怎么样?
try:
a = a
except NameError:
a = "new"
Run Code Online (Sandbox Code Playgroud)
它不是很短,但清楚地(至少对我来说)解释了代码的意图。