python中的短路评估分配?

时间:2012-11-13 14:49:01

标签: python

Ruby支持这个:

name = name || "default"

如果我在python中尝试:

name = name or "default"

口译员报告:

NameError: name 'name' is not defined

python中短路评估赋值的等价物是什么?

4 个答案:

答案 0 :(得分:18)

如果您确实定义了name,那么它会起作用:

name = None
name = name or 'default'

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

name = somefunction('name') or 'default'

答案 1 :(得分:10)

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中的其他习语)。我确保我的变量在开始时被声明为默认值,然后在需要时将它们更改为非默认值。

答案 2 :(得分:1)

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

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

...会做你想做的事情(让你在黑暗中知道你现在是否有全局变量或局部变量),并且非常丑陋,希望你不要尝试它。

答案 3 :(得分:0)

您可以尝试以下方法:

try:
    name = "some value"
except NameError:
    name = "default value"