【发布时间】:2012-07-19 10:41:20
【问题描述】:
我在 Ruby 中发现了一个有趣的表达式:
a ||= "new"
表示如果a没有定义,“新”值将赋给a;否则, a 将与原来相同。在进行一些数据库查询时很有用。如果设置了值,我不想触发另一个数据库查询。
所以我在 Python 中尝试了类似的心态:
a = a if a is not None else "new"
失败了。我认为这是因为如果未定义 a,您无法在 Python 中执行“a = a”。
所以我能出来的解决方案是检查 locals() 和 globals(),或者使用 try...except 表达式:
myVar = myVar if 'myVar' in locals() and 'myVar' in globals() else "new"
或
try:
myVar
except NameError:
myVar = None
myVar = myVar if myVar else "new"
如我们所见,解决方案并不那么优雅。所以我想问一下,有没有更好的方法呢?
【问题讨论】:
-
请注意,
variable ||= value的通常用法是将默认值设置为已定义的变量,使用它来定义可能存在或可能不存在的变量是恕我直言的不良做法。 -
我相信,try-except 解决方案是最 Pythonic 的。当然,它不像单个运算符那么简洁,但它清晰易读。
-
myVar = myVar if myVar else "new"- 请注意这是 python 而不是 ruby,在布尔上下文中很多东西都被认为是 False -
等等...你为什么要这样做?
-
我一直在做 Python 和 Ruby 编程方面的工作,但我很难想出一个示例,在该示例中您希望使用局部变量来实现此功能。当然,您可以将它与 Ruby 中的实例变量一起使用,但这将转换为 python 为
thing.foo = thing.foo or 'something else'。你有一个你想在哪里使用它的例子吗?
标签: python ruby expression