これがstackoverflowのものかどうかは完全にはわかりません。そうでない場合は修正してください。
つまり、次の内容の t.py があるとします。
class A(object):
pass
print("A:", A)
class B(object):
print("From B: A:", A)
class OuterClass(object):
class AA(object):
pass
print("AA:", AA)
class BB(object):
print("From BB: AA:", AA)
そして今、それを実行します:$ python3 t.py
A: <class '__main__.A'>
From B: A: <class '__main__.A'>
AA: <class '__main__.AA'>
From BB: AA:
Traceback (most recent call last):
File "t.py", line 9, in <module>
class OuterClass(object):
File "t.py", line 14, in OuterClass
class BB(object):
File "t.py", line 15, in BB
print "From BB: AA:", AA
NameError: name 'AA' is not defined
ドキュメントから:
クラス定義は実行可能なステートメントです。継承リストがある場合は、まずそれを評価します。継承リストの各項目は、サブクラス化が可能なクラス オブジェクトまたはクラス タイプに評価される必要があります。クラスのスイートは、新しく作成されたローカル名前空間と元のグローバル名前空間を使用して、新しい実行フレームで実行されます (名前付けとバインドのセクションを参照)。(通常、スイートには関数定義のみが含まれます。) クラスのスイートの実行が終了すると、その実行フレームは破棄されますが、ローカル名前空間は保存されます。[4] 次に、基本クラスの継承リストと属性ディクショナリの保存されたローカル名前空間を使用して、クラス オブジェクトが作成されます。クラス名は、元のローカル名前空間でこのクラス オブジェクトにバインドされます。
したがって、私は動作を理解していますが、他の場所のようにスコープをレキシカルにしないことの背後にある理論的根拠は理解していません。それは「特別なケースはルールを破るほど特別ではない」に反します。class
がたとえば と異なる動作をするのはなぜdef
ですか?
これは「実用性が純粋性に勝る」ケースですか?もしそうなら、その根拠は何ですか?最初は python 2.x のアーティファクトかもしれないと思っていましたが、上記のように、動作は python 3.3 にも存在します。