どちらが良いですか?
if not var:
var = get_var()
(また)var = var または get_var()
また、どうすればどちらが良いかを知ることができますか?
編集:
スティーブからのもう1つのオプション、
var = var if var else get_var()
どちらが良いですか?
if not var:
var = get_var()
(また)var = var または get_var()
また、どうすればどちらが良いかを知ることができますか?
編集:
スティーブからのもう1つのオプション、
var = var if var else get_var()
好きな方がいいです。私は最初のバージョンを使用しますif
が、これは非常に個人的なものです。
2 つのスタイル バリエーションがスタイル的に非常に近い場合、私timeit
はタイ ブレーカーとして使用します。より高速であるということは、Python の主流に近いこと、つまりより優れていることを意味するに違いありません。ねえ、終わりのない議論よりはましですよね?-)
$ python -mtimeit -s'var=0; getvar=lambda:0' 'var = var or getvar()'
1000000 loops, best of 3: 0.359 usec per loop
$ python -mtimeit -s'var=0; getvar=lambda:0' 'if not var: var = getvar()'
1000000 loops, best of 3: 0.361 usec per loop
$ python -mtimeit -s'var=1; getvar=lambda:1' 'var = var or getvar()'
10000000 loops, best of 3: 0.123 usec per loop
$ python -mtimeit -s'var=1; getvar=lambda:1' 'if not var: var = getvar()'
10000000 loops, best of 3: 0.0899 usec per loop
はそれを持っています -が false のif
場合は同等で、の場合は高速です。var
true
実際、get_var の呼び出しを使用して var が以前に設定されているかどうかを判断しようとしている場合、どちらの形式も間違っていると主張します。Python は、0、None、[]、(,)、set()、および {} のように、多数の完全に普通の値をブール値の「false」に評価するものとして扱います。では、var が整数になり、get_var() がたまたま 0 を返すとしましょう。使用する形式に関係なく、var が 0 であることは既にわかっているにもかかわらず、get_var() は何度も呼び出されます!
変数が定義されているかどうかを検出するには、いくつかの方法があります。
globals() または locals() によって返された辞書を調べます
ステートメントvar = var
を try/except ブロックでラップし、NameError をトラップします
None のようなセンチネル値を使用し、var をこの値に初期化します。if var is None: var = get_var()
次に、 (「==」ではなく「is」を使用して)テストできます。運が悪く、None が get_var() から返される可能性のある値である場合は、 のようなものを使用して独自の特別な未定義の値を定義し、それでNOT_DEFINED = object()
var を初期化する必要があります。その後、テストできます。のためにif var is NOT_DEFINED
。
私にとっては、明示的な if を使用する最初のイディオムの方がより明示的であるため、好ましいと言えます。
ただし、 or コンストラクトが優先/よりPythonicなものとして参照されているのを見てきました。
したがって、一方ではExplicit is better than implicit
(禅の引用)、他方では、短い式は pythonic と見なすことができます (ただし、短い式はすべての場合で pythonic と同等ではありません!)
密接に関連する SO の質問は、 None を空の string に変換する最も慣用的な方法であり、 if と or の両方のイディオムがそこにリストされていました。
最初のバージョンは私にとってより直感的です。しかし、繰り返しになりますが、それはすべてあなた自身の好みです。
2 つ目はより Pythonic であり、私は通常それを使用します。
どちらも間違っていません。
前者は、コードを読んでいる人にとってより明確に理解できます。
解決しようとしている問題について考えているときに、頭に浮かぶ概念が「もしこれなら、それなら」または「2 つのブール変数の論理 OR に近いが、完全ではない」に近いかどうかを自問してください。
or が短絡演算子である場合、どちらも最終的に同じコードにコンパイルされます (左側が true の場合、右側の引数は評価されません)。
あなたの意図をより明確に表現するので、最初のものを好むでしょう。2 番目のものは、おそらくよりコンパクトです。
インタープリターはおそらく両方の方法でそれらを実行します。コードの読みやすさに関してはトレードオフがあります。それが何をするのかを認識しやすいステートメントはどれですか? 確かに、最初の方がはるかに明確です。私にとって、この投稿を読んで、2番目の投稿についてもっと考えなければなりませんでした。2番目のステートメントが少し「セクシー」であっても、読みやすさが向上するため、最初のステートメントを使用します。
お役に立てれば。
-tjw