成人免费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

2014-08-01 09:50:39

Oracle營銷云Oracle Eloq

2022-10-31 07:09:15

拷貝代碼項目

2021-03-03 08:02:13

JavaScript函數字節

2009-11-30 11:33:01

2011-05-04 11:26:47

優化

2013-08-28 10:20:56

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久毛片| 国产精品96久久久久久 | av片毛片 | 国产高清精品在线 | 精品亚洲一区二区三区四区五区 | 色黄爽 | 日韩毛片在线免费观看 | 91在线观看视频 | 亚洲欧美在线视频 | 国产成人精品免费视频 | 夜夜夜夜夜夜曰天天天 | 6080亚洲精品一区二区 | 国产成人精品亚洲日本在线观看 | 国产视频精品在线 | 久久久久久91 | 99热这里有精品 | 99久久精品国产麻豆演员表 | 91日韩 | 蜜桃免费一区二区三区 | 日本在线观看网址 | 最新中文字幕在线 | 久久精品中文字幕 | 精品亚洲二区 | 精品久久久久久久久久久下田 | 自拍第一页| 一区二区三区免费 | 综合九九| 午夜视频免费在线 | 天天夜夜操 | 久久这里有精品 | 久久久久久99| 精品99久久| 久久乐国产精品 | 亚洲一区中文字幕 | 国产一二三视频在线观看 | 中文字幕第九页 | 国产美女在线观看 | 国产免费又色又爽又黄在线观看 | 伊人网伊人网 | 成人1区2区 | 国产成人av一区二区三区 |