获得__name__调用在Python功能的模块获得__name__调用在Python功能的模块(G

2019-05-17 12:46发布

假设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’)在这种情况下。 如何才能做到这一点?

Answer 1:

退房检查模块:

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

在函数里, inspect.stack()[1]会返回你的调用者的堆栈。 从那里,你可以得到有关呼叫者的函数名,模块等的详细信息

详情请参阅文档:

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

此外,道格·海尔曼在他PyMOTW系列检查模块的一篇精辟论述:

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

编辑:下面是一些代码,你想要做什么,我认为:

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


Answer 2:

类似的问题面前,我发现sys._current_frames()从sys模块包含了有趣的信息,可以帮助你,而不需要进口检查,至少在特定的使用情况。

>>> sys._current_frames()
{4052: <frame object at 0x03200C98>}

然后,您可以“动”起来使用f_back:

>>> f = sys._current_frames().values()[0]
>>> # for python3: f = list(sys._current_frames().values())[0]

>>> print f.f_back.f_globals['__file__']
'/base/data/home/apps/apricot/1.6456165165151/caller.py'

>>> print f.f_back.f_globals['__name__']
'__main__'

对于文件名,你也可以使用f.f_back.f_code.co_filename,由马克·罗迪以上建议。 我不知道这种方法的限制和注意事项(多线程将最有可能是一个问题),但我打算在我的情况下使用它。



Answer 3:

我不建议这样做,但你可以做到以下方法你的目标:

def caller_name():
    frame=inspect.currentframe()
    frame=frame.f_back.f_back
    code=frame.f_code
    return code.co_filename

然后,按以下步骤更新现有的方法:

def info(msg):
    caller = caller_name()
    print '[%s] %s' % (caller, msg)


文章来源: Get __name__ of calling function's module in Python