Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我们必须在装饰器的包装函数中使用函数值吗?_Python_Python 3.x_Parameters_Python Decorators - Fatal编程技术网

Python 我们必须在装饰器的包装函数中使用函数值吗?

Python 我们必须在装饰器的包装函数中使用函数值吗?,python,python-3.x,parameters,python-decorators,Python,Python 3.x,Parameters,Python Decorators,在一个视频中,我了解到我们不需要传递包装函数的参数(例如,在本例中显示),包装函数中将使用主函数的参数(div2)。 当我对上面的代码尝试同样的方法时,我得到了一个TypeError,该display()需要一个参数 我现在很困惑,在这种情况下,我的3个函数都应该具有如下参数: div2()->multi()函数本身作为参数 display()->显示函数值的参数multi() multi() 注意:当我让display()获取一个参数时,代码工作了问题不是display没有获取参数;这是因为你

在一个视频中,我了解到我们不需要传递包装函数的参数(例如,在本例中显示),包装函数中将使用主函数的参数(
div2
)。 当我对上面的代码尝试同样的方法时,我得到了一个
TypeError
,该
display()
需要一个参数

我现在很困惑,在这种情况下,我的3个函数都应该具有如下参数:
div2()
->
multi()
函数本身作为参数
display()
->显示函数值的参数
multi()
multi()


注意:当我让
display()
获取一个参数时,代码工作了

问题不是
display
没有获取参数;这是因为你使用它就像它使用一样。记住,decorator语法只是语法糖

def div2(mult):
    def display():

        print(f"we are doing a check of multiples if div by 2")
        if mult%2==0:
            return f"{mult} is divisible"
    return display

@div2
def multi(n):
    return n*n*n

print(multi(5))

div2
的结果不需要保留
div2
参数的签名,不过在使用该结果之前,您必须知道它是否保留签名

div2
的参数是一个函数,不能除以2。你的装饰师应该是

def multi(n):
    return n*n*n

multi = div2(multi)

这里multi接受一个参数,名为
n

def div2(f):
    def display(x):
        print(f"We are doing a check of multiples if div by 2")
        if f(x) % 2 == 0:
            return f"{x} is divisible"
    return display

@div2
def multi(n):
    return n*n*n

prin(multi(5))
使用decorator语法实际上与执行以下操作相同:

def multi(n):
    return n*n*n

因此,如果您希望能够将参数传递给包装器
display
,则必须定义它以获取参数。

感谢您的澄清
multi = div2(multi)