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

时间:2011-12-01 09:52:42

标签: python

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

看看检查

inspect.getsourcelines(object)    

也给出了行号。

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

wrapt模块通过允许您编写装饰器来解决此问题,该装饰器保留必要的元数据以查找函数的来源以及执行其他内省。它就像一个改进的a={} n=4 for i in xrange(n): itemtype = raw_input("enter the item type-b,m,t,d,c:") itemcost = raw_input("enter the item cost:") try: itemcost = float(itemcost) except ValueError: print "Sorry, please enter a valid cost." break if itemtype in ('b', 'm', 't', 'd', 'c'): a.setdefault(itemtype, []).append(itemcost) else: print "Sorry, please enter a valid type." print a