2011-09-14 6 views
3

セイにアクセスしたとき、私は次のPythonコードobjは、そのクラス定義のPythonオブジェクトですがPythonの:変数の割り当てのために、より簡潔な構文NoneTypeオブジェクト

が含まれていません

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

を持って、私はやっと同じことを実現できるより簡潔な構文(1行のコードのようなもの)があることを忘れないでください。私が夢を見ていなかったなら、誰かが簡単な構文が何であるかを教えてもらえますか?ありがとう。あなたが条件式のない古いPythonのバージョンを使用している場合

+0

検索やチュートリアルではありません運と同じであるのですか? –

+0

一般的に良い質問ですが、私はこれをどのように検索するのか分かりません。 –

+0

@ S.Lott - 私は答えを探してみましたが運はありませんでした。だから私は質問を掲示している。 – tamakisquare

答えて

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

Pythonの条件式を救済する! – jathanism

+2

ちょうど化粧品: 'identifier = obj.id if obj else None' – fgeller

+0

@fgeller:いいえ、objが0の場合は' None'に設定されます。 'identifier = obj.id obj is not else else 「なし」は動作しますが、不必要に言い訳に見えます。 –

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

これは、 'obj'が' None'のときだけでなく 'obj'にそのような属性がないときは' None'を使うことに注意してください。 – delnan

+0

@delnan - ありがとう、あなたのコメントは私が実際に質問を誤解していることを実感しました。 Tom Zychの答えは、OPが求めているものに対して正しいものです。 –

+0

@ F.J - これはまだ知っているよい技術的なヒントです。ありがとう。 – tamakisquare

1

、あなたはブール式の評価のセマンティクスに頼ることができます:ブール式の値が決定式のその用語の値であり、その最終的な価値。それは非常に抽象的に聞こえるが、あなたの場合にあなたが言うことができます。

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

objNoneある場合は、[None]として

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

ある

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

がどのTrue値を表していorには、の値を変更せずに任意の式を使用できます0の式の結果はobjNoneでない場合は、これはあなたがもし別名」条件付きの三項演算子をシミュレートしなければならなかった方法である

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

= ([obj.id])[0] 

= obj.id 

ある

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

を持ってNone

ある[None][0]です以前の時は "表現"である。

一般的なパターンはa if b else c

(b and [a] or [c])[0] 
関連する問題