以下が含まれているとしますmyapp/foo.py
:
def info(msg):
caller_name = ????
print '[%s] %s' % (caller_name, msg)
以下がmyapp/bar.py
含まれます:
import foo
foo.info('Hello') # => [myapp.bar] Hello
この場合、呼び出し関数のモジュール (「myapp.foo」) の属性caller_name
に設定したいのですが、どうすればよいでしょうか?__name__
ベストアンサー1
検査モジュールを確認してください:
inspect.stack()
スタック情報を返します。
関数内では、inspect.stack()[1]
呼び出し元のスタックを返します。そこから、呼び出し元の関数名、モジュールなどに関する詳細情報を取得できます。
詳細についてはドキュメントを参照してください:
python.org/library/inspect.html を参照してください。
また、Doug Hellmann は PyMOTW シリーズで、inspect モジュールについて優れた記事を書いています。
編集: ここに、あなたが望むことを実行するコードがあります。
import inspect
def info(msg):
frm = inspect.stack()[1]
mod = inspect.getmodule(frm[0])
print '[%s] %s' % (mod.__name__, msg)