python利用裝飾器進行運算的執行個體分析

來源:互聯網
上載者:User
今天想用python的裝飾器做一個運算,代碼如下

>>> def mu(x):  def _mu(*args,**kwargs):    return x*x  return _mu>>> @mudef 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*xTypeError: unsupported operand type(s) for *: 'function' and 'function'

原來是不能這樣弄的 函數與函數是不能運算的啊!

怎麼辦呢?

In [1]: from functools import wrapsIn [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。

以上所述就是本文的 全部內容了,希望大家能夠喜歡。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.