成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

@wraps 修飾器:讓你的 Python 代碼更加簡短可愛 | 從簡單實例來認識它

開發 前端
本文簡單與讀者朋友們「科普」一下修飾器,注意到我們這里實際上僅僅修飾了無參數的函數。其實,修飾器還有許多更加優雅用途,比如傳入參數 *args, **kwargs ,修飾類 __call__ 等用法。

[[406508]]

我們在上一篇文章(Python實例來認識并發與并行)中用到了 @timer ,在函數定義時,加上一個小小的 @timer ,這樣,函數執行結束后,就會自動在控制臺匯報自己運行的時間。

比如下面這樣:

  1. @timer 
  2. def piper(): 
  3.     for i in range(10000): 
  4.         i = i * i ** 10 
  5.  
  6. piper() 
  7.  
  8. 輸出: 
  9. timer: using 0.00600 s 

實際上,這個計時器邏輯 @timer 是我們自己用 Python 中的修飾器特性[1]來實現的。

拆解邏輯

其實我們不用修飾器,自己也能實現計時的邏輯。

  1. def piper(): 
  2.     for i in range(10000): 
  3.         i = i * i ** 10 
  4.  
  5. t = time.time()  # 記錄函數開始時時間 
  6. piper() 
  7. print(f"timer: using {time.time() - t :.5f} s")  # 獲取函數運行時間并打印 

注意到我們執行函數時,在其上下都包裹上了邏輯。如果我們希望函數自帶計時邏輯,那么為了包住原函數,只能去新定義一個函數。

  1. def time_wrapper(func): 
  2.     # func 是一個函數 
  3.     t = time.time() 
  4.     func() 
  5.     print(f"timer: using {time.time() - t :.5f} s"
  6.  
  7. time_wrapper(piper) 
  8.  
  9. 輸出: 
  10. timer: using 0.00600 s 

我們想測試某一個函數運行時間時,將函數名輸入到 time_wrapper 里面就好。

更優雅的改進

上述代碼顯然有缺點:

  • 我們在編程時,心智負擔增大了;此外,代碼更冗長了
  • 如果我們只是希望函數新增一個功能,顯然用 time_wrapper 是不行的,因為其并沒有改變 piper 本身

于是我們請出今天的主角 修飾器@wraps[2] 。

還用我們的 timer 舉例子,我們讓所有在 @timer 下的函數,都經過如下處理:

  1. def timer(func): 
  2.     @wraps(func) 
  3.     def inner_func(): 
  4.         t = time.time() 
  5.         rts = func() 
  6.         print(f"timer: using {time.time() - t :.5f} s"
  7.         return rts 
  8.     return inner_func 

以 piper 為例,我們經歷了如下變化。

  1. @timer 
  2. def 原始piper(): 
  3.     for i in range(10000): 
  4.         i = i * i ** 10 

實際上,當你再調用 piper 時,你的 piper 內部邏輯早已變為:

  1. def 當前piper(): 
  2.     t = time.time() 
  3.     rts = 原始piper() 
  4.     print(f"timer: using {time.time() - t :.5f} s"
  5.     return rts 

總結

本文簡單與讀者朋友們「科普」一下修飾器,注意到我們這里實際上僅僅修飾了無參數的函數。其實,修飾器還有許多更加優雅用途,比如傳入參數 *args, **kwargs ,修飾類 __call__ 等用法。期待以后我遇到好的應用場景,將經驗分享給朋友們。

 

責任編輯:姜華 來源: Piper蛋窩
相關推薦

2025-03-11 08:30:00

Pythonretrying代碼

2019-08-28 09:28:07

SSHOpenSSH運維

2024-04-26 11:54:10

Pygments代碼Pytho

2020-05-21 15:14:15

Python列表字典

2022-09-19 15:02:24

C語言

2020-05-21 08:53:12

Python技術代碼

2021-01-14 09:59:07

JS代碼編碼

2015-06-30 16:56:27

敏捷網絡石油石化華為

2018-01-31 11:20:48

2024-08-02 10:23:20

2021-07-01 10:03:55

Distroless容器安全

2023-07-03 07:55:25

2023-10-07 14:49:45

2018-09-06 10:16:39

2022-10-31 07:09:15

拷貝代碼項目

2014-08-01 09:50:39

Oracle營銷云Oracle Eloq

2021-03-03 08:02:13

JavaScript函數字節

2009-11-30 11:33:01

2013-08-28 10:20:56

2011-05-04 11:26:47

優化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久九九影视 | 国产乱肥老妇国产一区二 | 九九国产在线观看 | 国产高清在线精品一区二区三区 | 国产电影一区二区 | 一区二区三区在线观看视频 | 国产精品91久久久久久 | 日韩综合网 | 久久一级| a在线免费观看 | 日韩av免费在线电影 | 国产成人精品一区二 | 呦呦在线视频 | www.99热.com | 成人免费高清 | 911精品国产 | 日韩精品久久一区 | 久久中文一区二区 | 精品国产欧美一区二区 | 国产一级一级毛片 | 日本一二三区在线观看 | 中文在线一区 | 一区二区三区日韩精品 | 成人二区三区 | 老司机免费视频 | 日韩成人中文字幕 | 国产成人影院 | 欧美视频三区 | 久久久精品亚洲 | 国产精品入口麻豆www | 51ⅴ精品国产91久久久久久 | 黄色片视频 | 日韩精品一区二区三区四区视频 | 欧美日高清 | 成人国产精品免费观看视频 | 日本免费黄色一级片 | 91久久久久| 欧美一区二区成人 | 久久久久久国产 | 日韩在线视频一区二区三区 | 最新中文字幕在线 |