繁体   English   中英

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

[英]How to get line number of function (with/without a decorator) in a python module?

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

看看检查

inspect.getsourcelines(object)    

这也给出了行号。

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

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

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

但是,文件和行号信息不在函数对象本身中,您无法通过将此信息从包装函数复制到包装器来“修复”它们。 该数据包含在函数的code对象中(可与.func_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
>>> 

wrapt模块通过允许您编写装饰器来解决此问题,该装饰器保留必要的元数据以查找函数的来源以及执行其他内省。 这就像改进的functools.wraps

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM