如何使用@符号在python中修饰函数

如何使用@符号在python中修饰函数,python,closures,decorator,Python,Closures,Decorator,下面是我想在代码中执行的一个简单示例: def deco(func): def inner(x): num = func.__closure__[0].cell_contents print("I multiply with " + str(num)) return func(x) return inner def make_multiplier_of(n): def multiply(x): retur

下面是我想在代码中执行的一个简单示例:

def deco(func):
    def inner(x):
        num = func.__closure__[0].cell_contents
        print("I multiply with " + str(num))
        return func(x)
    return inner


def make_multiplier_of(n):
    def multiply(x):
        return x*n
    return multiply


multi7 = make_multiplier_of(7)
multi7 = deco(multi7)
print(multi7(5))
这个运行得很好

但如果我将代码更改为:

@deco
def make_multiplier_of(n):
    def multiply(x):
        return x*n
    return multiply
我得到一个错误:

num = func.__closure__[0].cell_contents
TypeError: 'NoneType' object is not subscriptable

我如何解决这个问题?/使用@符号修饰我的函数?

当你使用装饰器时,
func
参数是
make\u multiplier\u of
而不是
multiply
,这就是
func.\uu closure\u0]的原因。单元格内容
抛出异常

如果你能更换装饰师,这里有个解决办法

def deco(func):
    def inner(x):
        print("I multiply with " + str(x))
        return func(x)
    return inner

@deco
def make_multiplier_of(n):
    def multiply(x):
        return x*n
    return multiply


multi7 = make_multiplier_of(7)
print(multi7(5))
小心使用行为,因为
multi7=deco(multi7)
将发生变化


最好的祝愿

我想说的一个主要问题是,你的装饰师希望知道太多的内部装饰细节。首先,它可能不应该玩弄实现细节,比如
\uuuu closure\uuuu
。我发现记住
@deco
实际上是
make\u multiplier\u of=deco(make\u multiplier\u of)