有没有办法以编程方式获取函数的行号和名称?
例如,我想将一个字符串列表传递给一个函数:
s = [calling_module, calling_function, line_number]
report(s)
目前我只需手动完成:
s = ["module abc", "func()", "line 22", "notes"]
report(s)
但我想知道是否有一种自动方式让python为我填写模块名称(我认为__name__这样做),函数名称和行号。有办法吗?
答案 0 :(得分:2)
使用inspect
模块功能。例如,
import inspect
def b():
f = inspect.currentframe()
current = inspect.getframeinfo(f)
caller = inspect.getframeinfo(f.f_back)
#caller = inspect.getframeinfo(inspect.getouterframes(f)[1][0])
print(__name__, current.filename, current.function, current.lineno, caller.function)
def a():
b()
a()
答案 1 :(得分:1)
您可能想要traceback.extract_stack()
:
>>> def test():
... print "In Function"
... print traceback.extract_stack()
...
>>>
>>> test()
In Function
[('<stdin>', 1, '<module>', None), ('<stdin>', 3, 'test', None)]
虽然结果需要解析。
答案 2 :(得分:0)
from inspect import currentframe, getframeinfo, getmodulename
def report():
f = getframeinfo(currentframe().f_back)
print getmodulename(f.filename), f.lineno, f.function
请注意使用
__name__
将返回包含报告的模块的名称,而上面的代码将显示调用报告的模块的名称。