10

Ruby 支持这一点:

name = name || "default"

如果我在 python 中尝试:

name = name or "default"

口译报告:

NameError: name 'name' is not defined

python中短路评估分配的等价物是什么?

4

4 回答 4

19

如果您实际定义name它会起作用:

name = None
name = name or 'default'

短路与实际必须定义变量无关。通常,name已从某处拉出但为空(假)值:

name = somefunction('name') or 'default'
于 2012-11-13T14:50:00.633 回答
13
name = globals()['name'] if 'name' in globals() else 'default'

或者,更简洁地说:

name = globals().get('name','default')

替换locals()内部函数。


可能会更好try/except

try:
   name
except NameError:
   name = 'default'

作为旁注,我永远不会在我的代码中使用这些成语中的任何一个。(当然,我不会使用您提到的 Javascript 或 Ruby 中的其他成语)。我会确保我的变量在一开始就被声明为默认值,然后在需要时将它们更改为非默认值。

于 2012-11-13T14:51:03.793 回答
1

这是一个可怕的,可怕的想法,但是......

name = globals().get("name", locals().get("name", "default"))

...会做你想做的事(同时让你不知道你现在是否有一个全局变量或局部变量),并且丑陋到希望让你不去尝试它。

于 2012-11-13T14:58:44.437 回答
0

你可以试试这个:

try:
    name = "some value"
except NameError:
    name = "default value"
于 2018-09-27T05:03:33.657 回答