我的问题是:在 wrap 函数中,是否没有 func 可以得到 'inputed_num' 的闭包?
抱歉,这不是装饰器的工作方式。它们在函数最初定义后被应用。到那时,为时已晚。
当你写:
@num(5)
def test(a):
return a + inputed_num
这相当于:
def test(a):
return a + inputed_num
test = num(5)(test) # note that num(5) is called after test() is defined.
为了实现您的目标,让 inputed_num 成为test的第一个参数。然后,让您的装饰器传入该参数:
def num(num):
def deco(func):
def wrap(*args, **kwargs):
inputed_num = num
return func(inputed_num, *args, **kwargs) # this line changed
return wrap
return deco
@num(5)
def test(inputed_num, a): # this line changed
return a + inputed_num
@num(6)
def test2(inputed_num, a):
return a + inputed_num
print test(10) # outputs 15
print test2(10) # outputs 16
希望这能为你清除一切:-)