如何在python模块中获取函数的行号(有/没有装饰器)?

Har*_*ari 6 python

我想在源代码中获取python函数的行号.我在运行时拥有的是模块,类,方法对象

看看检查

inspect.getsourcelines(object)    
Run Code Online (Sandbox Code Playgroud)

这也给出了行号.

我看到对于带有装饰器的方法,行号.从上面检查功能点返回到实际装饰器的源代码而不是所需函数的源代码.那么解决这个问题的方法有哪些呢?(我知道解释器在运行时执行类似于装饰器内部的函数包装,但我可能错了)

650*_*502 6

在一般情况下没有简单的解决方案。

装饰器是给定函数返回一个函数的函数,通常通过将它“包装”在执行装饰器设计的操作的闭包中。

然而,文件和行号信息不在函数对象本身中,您无法通过将此信息从包装函数复制到包装器来“修复”它们。该数据包含在code函数的对象中(可用.func_code),并且在您将要创建的所有闭包之间共享。

>>> def bar(x):
...     def foo():
...         return x
...     return foo
... 
>>> f1 = bar(1)
>>> f2 = bar(2)
>>> f1()
1
>>> f2()
2
>>> f1.func_code is f2.func_code
True
>>> 
Run Code Online (Sandbox Code Playgroud)


Ale*_*all 5

缠住模块解决了这个问题,允许你编写装饰它保留了必要的元数据来找到一个函数的源代码以及执行其他自省。这就像一个改进的functools.wraps.