python装饰器的需求?

python装饰器的需求?,python,function,decorator,Python,Function,Decorator,我一直在努力了解装饰师。我把它们理解为一个函数,您可以通过它传递其他函数来修改某些功能。但是,返回以下类型错误。有人能解释一下(A)为什么这是无效的吗?以及(B)应如何修改此代码以返回12 def dec(x): 返回2*x @十二月 定义函数(x,y): 返回x*y >>> TypeError回溯(最近一次调用上次) 在里面 3. 12月4日 ---->5定义函数(x,y): 6返回x*y 7. 十二月十日 12月1日(x): ---->2返回2*x 3. 12月4日 5定义函数(x,y):

我一直在努力了解装饰师。我把它们理解为一个函数,您可以通过它传递其他函数来修改某些功能。但是,返回以下类型错误。有人能解释一下(A)为什么这是无效的吗?以及(B)应如何修改此代码以返回12

def dec(x):
返回2*x
@十二月
定义函数(x,y):
返回x*y
>>>
TypeError回溯(最近一次调用上次)
在里面
3.
12月4日
---->5定义函数(x,y):
6返回x*y
7.
十二月十日
12月1日(x):
---->2返回2*x
3.
12月4日
5定义函数(x,y):
TypeError:不支持*:“int”和“function”的操作数类型

您的decorator被指定一个函数作为参数,需要返回一个函数,而不是一个值。例如:

def dec(fn):
  def newfn(x, y):
    return 2 * fn(x, y)
  return newfn
关键是我返回了一个函数,如果调用该函数,将在内部调用fn,将结果乘以2并返回该值

装饰器用另一个函数替换一个函数。因此:

@dec
def mult(x, y):
  return x * y
与此完全相同:

def mult(x, y):
  return x * y
mult = dec(mult)
在这两种情况下,我用dec(mult)函数返回的任何内容替换mult。decorator语法只是一种方便的表达方式。如果dec不返回函数,那么当我试图调用mult时,我将得到一个错误

>>> def dec(fn):
...   return 12
...
>>> @dec
... def mult(x, y):
...   return x * y
...
>>> mult
12
>>> mult(9, 5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>>
>>def dec(fn):
...   返回12
...
>>>@dec
... def mult(x,y):
...   返回x*y
...
>>>骡子
12
>>>穆特(9,5)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“int”对象不可调用
>>>

mult是12,所以最后一行是“12(9,5)”,12不是一个可调用的函数,因此TypeError。

您的decorator得到一个函数作为参数,需要返回一个函数,而不是一个值。例如:

def dec(fn):
  def newfn(x, y):
    return 2 * fn(x, y)
  return newfn
关键是我返回了一个函数,如果调用该函数,将在内部调用fn,将结果乘以2并返回该值

装饰器用另一个函数替换一个函数。因此:

@dec
def mult(x, y):
  return x * y
与此完全相同:

def mult(x, y):
  return x * y
mult = dec(mult)
在这两种情况下,我用dec(mult)函数返回的任何内容替换mult。decorator语法只是一种方便的表达方式。如果dec不返回函数,那么当我试图调用mult时,我将得到一个错误

>>> def dec(fn):
...   return 12
...
>>> @dec
... def mult(x, y):
...   return x * y
...
>>> mult
12
>>> mult(9, 5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>>
>>def dec(fn):
...   返回12
...
>>>@dec
... def mult(x,y):
...   返回x*y
...
>>>骡子
12
>>>穆特(9,5)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“int”对象不可调用
>>>

mult是12,因此最后一行是“12(9,5)”,12不是可调用函数,因此TypeError。
dec
中的
x
是函数对象
func
。这就是错误告诉您的:
2*func
无法计算。您的装饰程序应该将callable作为参数,通常返回callable。您的“decorator”可能需要一个数字,因为它对参数所做的一切都是
2*x
。好的,当您对函数定义执行
@dec
时,它将函数作为
x
参数传递,因此出现错误
TypeError:unsupported操作数类型对于*:“int”和“function”
由于不能将函数对象与int对象相乘,如果您的目的是使修饰后的函数返回两倍于未修饰时的值,则应该让装饰器定义一些返回
2*f(*args)
,返回的函数
g
,然后让装饰程序在
dec
中返回该函数
g
x
,它是函数对象
func
。这就是错误告诉您的:
2*func
无法计算。您的装饰程序应该将callable作为参数,通常返回callable。您的“decorator”可能需要一个数字,因为它对参数所做的一切都是
2*x
。好的,当您对函数定义执行
@dec
时,它将函数作为
x
参数传递,因此出现错误
TypeError:unsupported操作数类型对于*:“int”和“function”
由于不能将函数对象与int对象相乘,如果您的目的是使修饰后的函数返回两倍于未修饰时的值,则应该让装饰器定义一些返回
2*f(*args)
,返回的函数
g
,然后让decorator返回这个函数
g
?否则我也会遇到类似的错误我扩展了我的回答来解释这一点。。。decorator可以返回您喜欢的任何内容,但请记住,您正在用decorator返回的内容替换原始函数。它不必是嵌套函数,但它必须是函数。所以作为一般规则,装饰器应该始终具有嵌套函数?否则我也会遇到类似的错误我扩展了我的回答来解释这一点。。。decorator可以返回您喜欢的任何内容,但请记住,您正在用decorator返回的内容替换原始函数。它不必是嵌套函数,但必须是函数。