自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[406508]]

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

比如下面這樣:

  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]來實現(xiàn)的。

拆解邏輯

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

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

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

  1. def time_wrapper(func): 
  2.     # func 是一個函數(shù) 
  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 

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

更優(yōu)雅的改進

上述代碼顯然有缺點:

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

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

還用我們的 timer 舉例子,我們讓所有在 @timer 下的函數(shù),都經(jīng)過如下處理:

  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 為例,我們經(jīng)歷了如下變化。

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

實際上,當你再調(diào)用 piper 時,你的 piper 內(nèi)部邏輯早已變?yōu)椋?/p>

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

總結(jié)

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

 

責任編輯:姜華 來源: 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

敏捷網(wǎng)絡石油石化華為

2018-01-31 11:20:48

2022-10-31 07:09:15

拷貝代碼項目

2023-10-07 14:49:45

2023-07-03 07:55:25

2021-07-01 10:03:55

Distroless容器安全

2024-08-02 10:23:20

2014-08-01 09:50:39

Oracle營銷云Oracle Eloq

2018-09-06 10:16:39

2009-11-30 11:33:01

2021-03-03 08:02:13

JavaScript函數(shù)字節(jié)

2023-11-18 09:07:59

Go語言技巧

2011-05-04 11:26:47

優(yōu)化
點贊
收藏

51CTO技術棧公眾號