Python では、オブジェクト (私の場合は関数) を含むコンテキストを取得して、それを変更するにはどうすればよいですか? たとえば、メソッドの場合、そのコンテキストはクラスです。フリー関数の場合、そのコンテキストはモジュールです。
2 に答える
独自のバージョンを展開する必要があると思いますが、ここで必要なもののほとんどは標準ライブラリinspect
モジュールで取得できます。
inspect.ismethod()
またinspect.isfunction()
、関数がバインドされている (クラスで定義されている) かどうかを判断するのに役立ちます。したがって、クラスまたはモジュールを探しているかどうかを判断するのに役立ちます (関数がモジュール以外のスコープで定義されている可能性があるため)。 .. たとえば、別の関数またはメソッドのスコープ内でローカルに定義された関数として、またはラムダとして (実際には同じこと))
特にim_class
、メソッドの はメソッドが定義されたクラスを取得しないことに注意してください。ただし、( を使用してinspect.getmro()
) クラス階層をたどって、メソッドが定義された「最新の」クラスを見つけることができます。
ところで-モジュールの変更があなたが望むものになるかどうか疑問に思っています...多くの場合、そのモジュール内の名前はすでに他の場所にインポートされている可能性があります...)特に私は心配しています(あなたとあなたの将来の正気のために) ruby メタプログラミングの経験があり、それを python で再現しようとしている場合 - それは非常に異なり、python で rubyish をやろうとしないのが最善です。
あなたが意味するのは、関数globals()
とlocals()
です。どちらも、それぞれグローバルとローカルを含む辞書を返します。ただし、それらを変更することは許可されていないため、メタプログラミングを行うことはできません。
globals
私の知る限り、現在のもの( /の呼び出し元)以外のコンテキストを取得する方法はありませんlocals
。