获取我自己的模块中定义的所有方法

时间:2014-12-02 14:13:12

标签: python python-3.x

说我有一个这样的模块:

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)

1 个答案:

答案 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