1

有没有办法以编程方式获取函数的行号和名称?

例如,我想将字符串列表传递给函数:

s = [calling_module, calling_function, line_number]
report(s)

目前我只是手动输入:

s = ["module abc", "func()", "line 22", "notes"]
report(s)

但是我想知道python是否有一种自动的方式来为我填写模块名称(我认为 __name__ 会这样做)、函数名称和行号。有办法吗?

4

3 回答 3

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()
于 2013-08-04T17:26:48.070 回答
1

您可能需要以下内容traceback.extract_stack()

>>> def test():
...   print "In Function"
...   print traceback.extract_stack()
...
>>>
>>> test()
In Function
[('<stdin>', 1, '<module>', None), ('<stdin>', 3, 'test', None)]

虽然需要解析结果。

于 2013-08-04T17:26:16.843 回答
0
from inspect import currentframe, getframeinfo, getmodulename

def report():
    f = getframeinfo(currentframe().f_back)
    print getmodulename(f.filename), f.lineno, f.function

请注意,使用

__name__ 

将返回包含报告的模块的名称,而上面的代码将显示调用报告的模块的名称。

于 2013-08-04T17:29:08.377 回答