2 つの問題を 1 つにまとめているようですね。
まず、短絡の問題があります。Marcin's answer はこの問題に完全に対処しているため、これ以上改善しようとはしません。
次に、ブール値に変換するのではなく、最後に評価された値or
を返します。and
両方の方法で行われる議論があり、分割のどちらかの側に多くの言語を見つけることができます.
最後に評価された値を返すことでfunctionCall(x) or defaultValue
ショートカットが可能になり、おそらく無駄な変換が回避されます (それを使用する唯一のことが非ゼロかどうかを確認することである場合、なぜ anint
2
を a に変換するのでしょうか?)、一般的に説明が簡単です。bool
1
したがって、これらの理由のさまざまな組み合わせにより、C、Lisp、Javascript、Lua、Perl、Ruby、VB などの言語はすべてこの方法で処理を行い、Python も同様です。
true
演算子から常にブール値を返すことは、いくつかのエラーをキャッチするのに役立ちます(特に、論理演算子とビットごとの演算子が混同しやすい言語で)。ゼロ以外をチェックするだけで、演算子の型を簡単に書き出すことができ、2 つのオペランドが異なる型である場合の変換を処理する必要がなくなります ( ?:
C ファミリ言語の演算子を参照してください)。したがって、これらの理由のさまざまな組み合わせにより、C++、Fortran、Smalltalk、Haskell などの言語はすべてこのように動作します。
あなたの質問では(私が正しく理解している場合)、この機能を使用して次のようなものを書くことができます:
if (x or 0) < 1:
いつx
でも簡単にできますNone
。x if x else 0
この特定の使用例は、 (Python 2.5 以降では) より明示的な方が書きやすく、おそらく理解しやすい (少なくとも Guido はそう考えている) だけでなく、とにかくNone < 1
と同じであるため、あまり有用ではありません。 0 < 1
(少なくとも Python 2.x では、常に 2 つのオプションのうち少なくとも 1 つを使用できます)... しかし、これが役立つ同様の例があります。次の 2 つを比較してください。
return launchMissiles() or -1
return launchMissiles() if launchMissiles() else -1
2 つ目は、南極で敵を 1 回ではなく 2 回吹き飛ばして大量のミサイルを無駄にします。
Python がこのようにする理由に興味がある場合は、次のようにします。
1.x の時代には型はありませんでしbool
た。None
、0
、[]
、()
、などの偽の値があり""
、それ以外はすべて真です。から戻るのはばかげていたでしょう。が追加されるまでに(IIRC の 2 つの 2.x バージョンで徐々に)、現在のロジックは既に言語にしっかりと組み込まれており、変更すると多くのコードが壊れていました。False
True
1
or
1
[1, 2, 3]
"dsfsdf"
bool
では、なぜ 3.0 で変更しなかったのでしょうか? or
BDFL Guido を含む多くの Python ユーザーは、この場合 (少なくとも "TOOWTDI" に違反しているため) を使用しないことを提案しています。代わりに、式の結果を変数に格納する必要があります。たとえば、次のようになります。
missiles = launchMissiles()
return missiles if missiles else -1
実際、Guido は を禁止したいと述べており、それが、彼が以前に何度も拒否した 3 項式をlaunchMissiles() or -1
最終的に受け入れた理由の1 つです。しかし、他の多くの人は同意しません。Guido は 慈悲深いDFL です。また、ここでやりたいことを拒否しながら (しかし、Guido はあなたが望んでいないことを) 他の場所で期待どおりに動作させることは、実際にはかなり複雑です。if
else
or
したがって、Python は、Java、Smalltalk、および Haskell と同じ側ではなく、ここではおそらく常に C、Perl、および Lisp と同じ側にあるでしょう。