2012-11-13 54 views
3

Ruby支持這一點:python中的短路評估分配?

name = name || "default" 

如果我嘗試在Python:

name = name or "default" 

解釋報告:

NameError: name 'name' is not defined 

什麼是蟒蛇短路評價任務的相同呢?

+3

這適用於紅寶石由於[瘋''X == x''其中''x''未定義爲''nil''](https://www.destroyallsoftware.com/talks/wat) 。這在Ruby中是一種罕見的愚蠢行爲。 Javascript是...好吧,讓我們不要去那裏。 –

+1

@Lattyware Ruby支持甚至更短以上的版本,'名|| =「默認」' –

+0

不知道關於Ruby,JavaScript的,但不支持這樣的:'節點-e「富= FOO || 1'' =>'ReferenceError:foo沒有定義' – georg

回答

9
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中的其他成語)。我會確保我的變量在一開始就被聲明爲默認值,然後在需要時將它們更改爲非默認值。

+6

你經常遇到動態生成的本地人或全局變量? *通常*(在Ruby和JavaScript中)你只是偶然發現了一個編程錯誤。至少Python引發了一個異常! –

+3

+1例外 - 這是處理這個問題的正確方法。 (儘管在大多數情況下,你可能應該使用字典)。另一種方法,我不會使用。 –

+0

@MartijnPieters - 我非常頻繁地在'bash'中遇到未定義變量只是空的地方。我從來沒有在python中遇到過,但我唯一使用的python代碼是我自己的......我不知道別人做了什麼,除非我通過足夠長的時間來推斷它。 – mgilson

12

如果你真的定義name它會工作:

name = None 
name = name or 'default' 

短路是獨立於實際上有定義的變量。一般來說,name已經從地方拉昇,但空(falsy)值:

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

爲什麼這不是被接受的答案? – dreftymac

1

這是一個可怕的,可怕的想法,但...

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

...會做你想做的(同時使你在黑暗中,你是否現在有一個全局或局部變量)並且足夠醜陋,希望讓你試試它。