次のコードを検討してください。
GLOBAL_VARIABLE = 1
def someFunction():
nonLocalVariable = 2
def anotherFunction():
localVariable = 3
class LocalClass(object):
__metaclass__ = MyMetaClass
__customCode = """
GLOBAL_VARIABLE + nonLocalVariable + localVariable
"""
anotherFunction()
someFunction()
私は、プロパティMyMetaClass
の内容に基づいてクラスのメソッドを生成するメタクラスの実装者です。
Python式を含めることができるので、で言及されている変数名が、通常のPythonメソッドで定義されている同じ変数名と同じオブジェクトを参照していることを確認したいと思います。__customCode
__customCode
__customCode
メタクラスが呼び出されると、クラスの内容を含むdictが渡されます。つまり、メタクラスはについて知っています__customCode
が、それはあまり役に立ちません。を使用すると、
ステートメントが実行されてinspect.currentframe(1)
いるスタックフレーム、つまり。を取得します。そのスタックフレームには、属性(を含む)と
属性(特にを含む)がありますが、これら2つを合わせても全体像はわかりません。class
anotherFunction()
.f_locals
localVariable
.f_globals
GLOBAL_VARIABLE
のスタックフレームanotherFunction()
(またはの実装内から取得できるその他のもの)を考えると、存在する名前空間、およびグローバル名前空間とローカル名前空間の間にネストされた他の名前空間をMyMetaClass
どのように見つけることができますか?nonLocalVariable
私は現在Python2.7を使用していますが、Python 3.xで答えが異なる場合は、それも知っておくとよいでしょう。