假设我将装饰器定义为:
from inspect import stack
def decorator():
def wrapper(function):
print stack()[1]
return function
return wrapper
当我定义一个没有像这样的可选参数的函数时:
@decorator()
def f(a):
pass
它说第一行调用了包装器,打印出来:
(<frame object at 0x10bf9c3b0>, '<stdin>', 1, '<module>', None, None)
当我使用可选参数定义函数时:
@decorator()
def f(a=True):
pass
它说第二行调用了包装器,打印出来:
(<frame object at 0x10bf08c58>, '<stdin>', 2, '<module>', None, None)
为什么可选参数会改变堆栈?是否有任何方法可以改变其中一个,以便它们与定义函数的方式相同(请记住装饰器和函数之间是否允许有空行)?
这似乎发生在我能找到的每个追溯函数中,以及python 3中(如果你当然更改了print语句)。