フレーム オブジェクトを指定すると、対応するモジュール オブジェクトを取得する必要があります。つまり、これが機能するように callers_module を実装します。
import sys
from some_other_module import callers_module
assert sys.modules[__name__] is callers_module()
(このテスト ケースの関数でスタック トレースを生成できるため、これは同等です。インポートは、その例を完全でテスト可能にするためだけにあり、callers_module が別のモジュールにあるため、__name__ を使用するショートカットを使用するのを防ぎます。 .)
私はこれを試みました:
import inspect
def callers_module():
return inspect.currentframe().f_back
フレームオブジェクトを取得し、その上でf_codeがコードオブジェクトを提供しますが、対応するモジュールまたはその名前を取得する方法がわかりません(sys.modulesで使用するため)。関数オブジェクトを取得できた場合、それらには __module__ 属性があります (コード オブジェクトもあります) が、フレームには存在しません。実際、すべてのコード オブジェクトが関数オブジェクトに属しているわけではありません。たとえば、私のテスト ケースのコード (上記の assert を使用) などです。モジュールを持たないフレーム/コード オブジェクトについても同じことが言えます。ただし、その場合も単純な None または例外で問題ありません。
シンプルなものが欠けているような気がします。これが機能するために何をする必要がありますか?