今天想用python的裝飾器做一個運算,代碼如下
>>> 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 "
", line 1, in
test(3,5)
File "
", line 3, in _mu
return x*x
TypeError: unsupported operand type(s) for *: 'function' and 'function'
原來是不能這樣弄的? 函數與函數是不能運算的啊!
怎么辦呢?
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,它能保留原有函數的名稱和docstring。
以上所述就是本文的 全部內容了,希望大家能夠喜歡。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

