说我有一个像这样的模块:
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)
您可以使用以下方法检查框架对象的模块名称:
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__')]
那也会得到类型,因为从技术上讲它们看上去有点像函数,但是如果需要,您可以进一步完善条件。(有关其他详细信息,请参见另一个问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句