オブジェクトが割り当てられている名前を判別するためのコードを書いています。これは、一般的なデバッグ作業のためであり、Pythonの内部にさらに慣れるためのものです。
可能であれば、そのクラスのすべてのインスタンスに名前が記録されるように、クラスデコレータとして構造化しています。コードはかなり長いので、尋ねられない限り投稿しません。一般的なテクニックは次のとおりですが
クラスの
__init__
メソッドをコードで装飾して、私がやりたいことを実行します設定
caller = inspect.currentframe().f_back
して開きinspect.getframeinfo(caller).filename
、に送信しast.parse
ます。ここではエラーチェックを行いません。これは、(1)これはデバッグ/プロファイリング/ハッキングのためだけのものです(2)この正確なプロセスが「完了したばかり」であるか、コードが実行されていないためです。これに問題はありますか?現在実行中のメソッドを実行さ
ast.Assignment
せるインスタンスを見つけます__init__
その場合
len(assignment.targets) == 1
、左側にアイテムが1つしかないので、から名前を取得できますtargets[0].id
。のような単純な形式a = Foo()
でassignment.value
は、はのインスタンスですast.Call
。リテラル(リストなど)の場合、value
関心のあるオブジェクトが名前に割り当てられていないため、そのリストとベイルになります。
assignment.value.func
それが実際type(obj).__call__
に私が興味を持っているオブジェクトであることを確認するための最良の方法は何ですか。それが「どこかにある」か、コードが実行されないことさえ保証されていると確信しています。私はそれがトップレベルにある必要があります。当然のことは、それを歩き、内部呼び出しが含まれていないことを確認することです。そうすれば、私は自分の名前を持っていることが保証されます。(私の推論は正しいです、その仮定が正しいかどうかはわかりません)。これは理想的ではありません。なぜなら、私が興味を持っている場合、それがであるかどうかわからないのでFoo
、これは私を投げ捨てることにつながる可能性があるからです。 a = Foo(Bar())
a = Bar(Foo())
もちろん、確認するassignment.value.func.id
ことはできますが、誰かがやった可能性がFoobar = Foo
あるので、これに過度に依存したくありません。
どんな助けでも大歓迎です。いつものように、私は見落としているかもしれない他の提案や問題に興味があります。
また、「python-internals」タグを発明しなければならなかったことに本当に驚いています。