python利用装饰器进行运算

今天想用python的装饰器作一个运算,代码以下
html

>>> def mu(x):
	def _mu(*args,**kwargs):
		return x*x
	return _mu

>>> @mu
def test(x,y):
	print '%s,%s' %(x,y)

	
>>> test(3,5)

Traceback (most recent call last):
  File "<pyshell#111>", line 1, in <module>
    test(3,5)
  File "<pyshell#106>", line 3, in _mu
    return x*x
TypeError: unsupported operand type(s) for *: 'function' and 'function'


原来是不能这样弄的  函数与函数是不能运算的啊!python

怎么办呢?shell

In [1]: from functools import wraps

In [2]: def mu(x):
   ...:         @wraps(x)
   ...:         def _mu(*args,**kwargs):
   ...:                         x,y=args
   ...:                         return x*x
   ...:         return _mu
   ...: 

In [3]: @mu
   ...: def test(x,y):
   ...:         print '%s,%s' %(x,y)
   ...:     

In [4]: test(3,4)
Out[4]: 9


Python装饰器decorator)在实现的时候,有一些细节须要被注意。例如,装饰后的函数其实已是另一个函数了(函数名等函数属性会发生改变)函数

Python的functools包中提供了一个叫wraps的decorator来消除这样的反作用。写一个decorator的时候,最好在实现以前加上functools的wrap,它能保留原有函数的名称和docstringspa

相关文章
相关标签/搜索