在Python中获取调用函数模块的__name__


问题内容

假设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

在这种情况下,我想caller_name设置为“__name__调用函数”模块的属性(即“ myapp.foo”)。如何才能做到这一点?


问题答案:

检出检查模块:

inspect.stack() 将返回堆栈信息。

在函数内部,inspect.stack()[1]将返回调用者的堆栈。从那里,您可以获得有关调用者的函数名称,模块等的更多信息。

有关详细信息,请参阅文档:

http://docs.python.org/library/inspect.html

此外,Doug Hellmann在他的PyMOTW系列中对检查模块做了很好的撰写:

http://pymotw.com/2/inspect/index.html#module-
inspect

编辑:这是一些您想要的代码,我认为:

import inspect

def info(msg):
    frm = inspect.stack()[1]
    mod = inspect.getmodule(frm[0])
    print '[%s] %s' % (mod.__name__, msg)