说我有一个这样的模块:
def print_hello(name):
" prints a greeting "
print("Hello, {}!".format(name.title()))
我想在我的模块上设置一个sys.settrace,所以每当我的模块中的函数被调用时,它会向stdout输出一个块,就像这样
CALLED FUNCTION: say_hello()
Hello, Alex!
可以预见,trace方法将获取所有被调用的方法,结果如下:
$ python3 trace_example.py
Called function: print_hello
Hello, Alex!
Called function: _remove
如何判断方法是否在当前模块中?
(如果你想知道,这是我的追踪功能)。
import sys
def tracefunc(frame, event, args):
if event == 'call':
print("Called function: {}()".format(frame.f_code.co_name))
sys.settrace(tracefunc)
答案 0 :(得分:1)
您可以使用以下方法检查框架对象的模块名称:
frame.f_globals['__name__']
或者如果你想检查帧堆栈中的上一个调用,(我现在不确定哪一个更有趣):
frame.f_back.f_globals['__name__']
当然,请注意f_back
可能是None
,并且全球字典可能没有__name__
成员。
<强>更新强> 如果您有一个模块对象并想要列出所有顶级可调用对象:
callables = [n for n,f in module.__dict__.items() if hasattr(f, '__call__')]
这也会得到类型,因为从技术上讲它们看起来有点像函数,但如果你愿意,你可以进一步细化条件。 (有关其他详细信息,请参阅此其他question。