eval
コード内の別の場所からのコンテキストを使用して、基本的に遅くする方法を見つけようとしています。例として、クラスFriend
があり、次のように使用できます。
>>> class A:
... friend = Friend('B')
...
>>> class B:
... friend = Friend('A')
...
>>> A.friend.getobject()
<class '__main__.B'>
ただし、Friend
コード内の別の場所、別のライブラリで定義されており、次のようになります。
class Friend:
def __init__(self, objname):
self.objname = objname
def getobject(self):
return eval(self.objname, original_context)
sqlalchemy ORM には、列を定義するための同様のパターンがありますが、セッション内のすべての所有クラス (テーブルなど) を追跡することによって実装されています。必要に応じて同様のことを行うことができますが、これを行う別の方法があるかどうかを知りたいです。私はフレームとインタープリタースタックを見てきました。関連するフレームのローカルに のようなものを使用してアクセスできると思いますが、オブジェクトが定義される前に呼び出されるinspect.stack()[1][0].f_locals
これを行う必要があります。Frame.__init__
私の質問は を見つける方法original_context
ですが、必要なときにのみです。Friend
これは 2 つの問題に帰着します: 1.インスタンス化された環境 (またはフレーム?) にアクセスする方法。getobject
2.呼び出された時のアクセス方法。