2011-09-14 79 views
3

說,當更簡明的語法變量賦值,我有以下Python代碼的Python:訪問NoneType對象

if obj is None: 
    identifier = None 
else: 
    identifier = obj.id 

其中obj是一個Python對象的類定義中不包括

我勉強記得有一個更簡潔的語法(如單行代碼?),可以實現相同。如果我不是在做夢,有人可以請告知這個簡單的語法可能是什麼?謝謝。

+0

沒有運氣搜索或教程? –

+0

一般的問題很好,但我不確定我會如何尋找這個,是嗎? –

+0

@ S.Lott - 我試圖尋找答案,但沒有運氣。這就是爲什麼我發佈這個問題。 – tamakisquare

回答

8
identifier = None if obj is None else obj.id 
+0

Python的條件表達式來拯救! – jathanism

+2

Just cosmetics now:'identifier = obj.id if obj else None' – fgeller

+0

@fgeller:不,如果obj是0,則它會將它設置爲None。如果obj不是0,則標識符= obj.id沒有'的作品,但似乎不必要的羅嗦。 –

2
identifier = getattr(obj, "id", None) 
+1

請注意,當'obj'上不存在這樣的屬性時,這將使用'None',而不僅僅是當'obj是None'時。 – delnan

+0

@delnan - 謝謝,您的評論讓我意識到我實際上誤讀了這個問題。 Tom Zych的回答對於OP的要求是正確的。 –

+0

@ F.J - 這仍然是一個很好的技術提示。謝謝。 – tamakisquare

1

如果使用沒有條件表達式的老Python版本,你可以藉助布爾表達式的計算語義:布爾表達式的值是在表達這個詞的這就決定了價值的最終價值。這聽起來很抽象,但在你的情況,你可以說:

((obj is None and [None]) or [obj.id])[0] 

如果objNone你有

((True and [None]) or [obj.id])[0] 

這是

([None] or [obj.id])[0] 

由於[None]表示True值,可以使用任何表達式編輯or而不更改的值0表達式的結果是[None][0]這是None

如果obj不是None你有

((False and [None]) or [obj.id])[0] 

這是

(False or [obj.id])[0] 

= ([obj.id])[0] 

= obj.id 

這是怎麼了模擬三元運算符又名「條件,如果表達「如果以前。

的一般模式是a if b else c相同

(b and [a] or [c])[0] 
相關問題