georgesi の回答は、あなたが尋ねた正確な質問に完全に回答していますが、リンク先のドキュメントもそうです。したがって、おそらくあなたはもっと欲しいでしょう。
次の 2 つのことを尋ねている可能性があります。
- 私のネイティブの直感/お気に入りの言語が
or
を返す必要があると言うのに、なぜbool
Python はこのように設計されたのでしょうか?
- Python はこれをどのように実装しますか?
「Python操作の背後で実際に何が起こってor
いるのか」という質問を太字にしたので、後者だと思います。
Python には複数の実装があり、参照ドキュメントで設定された仕様を満たしている限り、自由に実装できます。しかし、通常、人々が「Python はこれをどのように行うのですか?」と尋ねると、彼らは「CPython 実装はこれをどのように行うのか?」という意味です。
まず、いくつかのバイトコードを見てみましょう:
>>> def f():
... return 1 or 2
>>> import dis
>>> dis.dis(f)
2 0 LOAD_CONST 1 (1)
3 JUMP_IF_TRUE_OR_POP 9
6 LOAD_CONST 2 (2)
>> 9 RETURN_VALUE
これは何を意味するのでしょうか?Python 風の疑似コードでは、次のようになります。
top = 1
if top:
goto 9
else:
del top
top = 2
label 9
return top
よりよく理解したい場合 (CPython が重要な実装である場合)、CPython バイトコード インタープリターが単純なスタック マシンであり、そのスタック マシンのコードが file 内にあることを知っておく必要がありますceval.c
。したがって、ここJUMP_IF_TRUE_OR_POP
でコードを見つけることができます。(オペコードは定数値をスタックにプッシュするだけなので、それを見つけることができます。どのように機能するかを理解するためにそれを調べる必要はないと思います。)LOAD_CONST
w = TOP()
or
もう少し複雑であることがわかります。
これは主に、 に相当する C-API を呼び出す前にif top
チェックif top == False
してパーツを最適化し、その呼び出しからの例外を処理する必要があるためです。しかし、スタックの使用も最適化しています。方法と作業を説明しないと、正確に理解するのは困難ですが、基本的な考え方は、値をスタックからポップして、値をプッシュバックして返すことを回避することです。if top == True
bool(top)
bool
DISPATCH
FAST_DISPATCH
or
しかし、それは「Python操作の背後で実際に何が起こっているのか?」ということです。
あなたはまた、「降伏することは想定されていませんか、それとものみですか?or
True
False
」と太字にしたので、質問 1 に戻ります。
まず、ダック タイピングが Python の中心であることを思い出してください。or
あたかもそれが重要であるかのようにTrue
、またはFalse
どこでも使用できる何かを生成することになっています。特に(またはまたはまたは何でも)if foo:
ではなくのようなものを書くことになっているので、違いを気にするべきではありません。if foo == True:
if foo is True:
if foo != False:
第二に、約半数の言語が、「ブール演算」はブール型の値を厳密に返す必要があることに同意しますが、半分の言語は同意しません。C のように、ダック タイピングを中心に構築されていない言語でも。では、言語設計者はどのように決定すればよいのでしょうか。
or
演算子を常に返すようにする "C++ スタイル" は、bool
コピーを回避し、コンパイラによるより適切な静的型の適用を可能にし、より適切な動的型情報をプログラマーに提供します。最初の 2 つは Python ではまったく関係がなく、最後の 2 つは通常、ダック タイピングではなく型に依存するコードを記述している場合にのみ役立ちます。
最初の真の値 (または最後の偽の値) をそのまま返す「C スタイル」は、実装をわずかに単純化し、プログラマーに 3 項if
-else
式の一種の省略形を提供します。
Python に 3 項のif
-がなかった頃else
は、これは簡単に呼び出すことができました。特に一部の人々はそれa or b
を略記として嫌い、 a if a else b
Pythonic ではないと考えているためです。
しかし、歴史はすでにあるものの側にあります。やむを得ない理由がない限り、何も変更されません。また、好みによっては反対の方向に進む可能性があるという危機的状況は、やむを得ない理由ではありません。