偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

終于解決了使用Python裝飾器中的一個痛點

開發(fā) 后端
如何給裝飾器的參數(shù)傳參,這個問題曾經(jīng)困擾我好久,雖然Python版本的更新,現(xiàn)在這個問題終于解決了,特此記錄。

 前言

如何給裝飾器的參數(shù)傳參,這個問題曾經(jīng)困擾我好久,雖然Python版本的更新,現(xiàn)在這個問題終于解決了,特此記錄。

[[346777]]

疑問

首先我有一個這樣的裝飾器文件路徑helper/log_helper.py

 

  1. import traceback 
  2. from functools import wraps 
  3.  
  4. from loguru import logger 
  5.  
  6.  
  7. def my_logger(count): 
  8.     def step1(foo): 
  9.         @wraps(foo) 
  10.         def step2(*args, **kwargs): 
  11.             try: 
  12.                 result = foo(*args, **kwargs) 
  13.                 logger.info(f"{result=},{count=}"
  14.             except Exception: 
  15.                 logger.exception(traceback.format_exc()) 
  16.  
  17.         return step2 
  18.  
  19.     return step1 

然后我有個文件需要引用這個裝飾器demo.py

 

  1. from helper.log_helper import my_logger 
  2.  
  3.  
  4. class Demo: 
  5.     @my_logger(count=2) 
  6.     def main(self): 
  7.         return "in main function" 
  8.  
  9.  
  10. if __name__ == '__main__'
  11.     d = Demo() 
  12.     d.main() 

輸出結(jié)果如下

 

  1. 2020-10-16 11:43:12.001 | INFO     | helper.log_helper:step2:18 - result='in main function',count=2 

這個裝飾器的作用很簡單,就是獲取當(dāng)前函數(shù)的返回值,和傳入的count值。

好,現(xiàn)在問題來了?

如果給裝飾器的參數(shù)傳值呢,也就是說我的count=2,是通過傳值的形式。你想到可能是這樣

 

  1. from helper.log_helper import my_logger 
  2.  
  3. COUNT=2 
  4. class Demo: 
  5.     @my_logger(count=COUNT
  6.     def main(self): 
  7.         return "in main function" 
  8.  
  9.  
  10. if __name__ == '__main__'
  11.     d = Demo() 
  12.     d.main() 

ok,這樣確實可以,我們還可以使用再簡化一步

 

  1. from functools import partial 
  2. from helper.log_helper import my_logger 
  3.  
  4. COUNT=2 
  5. my_logger = partial(my_logger,count=2) 
  6.  
  7.  
  8. class Demo: 
  9.     @my_logger() 
  10.     def main(self): 
  11.         return "in main function" 
  12.  
  13.  
  14. if __name__ == '__main__'
  15.     d = Demo() 
  16.     d.main() 

暫時來看我們搞定了傳參數(shù)的問題,這時候我們想如果外界調(diào)用了Demo類的main方法,并且向指定count的值怎么辦呢?

我們知道外界調(diào)用Demo類傳參的唯一途徑就是向__init__里進(jìn)行傳參數(shù),按照這個思路我們只能這么寫了,

 

  1. class Demo: 
  2.     def __init__(self): 
  3.         count =2 
  4.     @my_logger(count=self.count
  5.     def main(self): 
  6.         return "in main function" 

但是這樣并不可以,我們得到錯誤信息

 

  1. NameError: name 'self' is not defined 

在裝飾器中無法使用self.形式的參數(shù),難道這個問題解決不了么?

問題解決

在Python3.7之前確實沒什么可行的方案。

我們知道在Python3.7的時候引入了dataclasses,我們可以通過它來簡化__init__。

改下我們的代碼

 

  1. from functools import partial 
  2.  
  3. from helper.log_helper import my_logger 
  4. from dataclasses import dataclass 
  5.  
  6. @dataclass() 
  7. class Demo: 
  8.     countint = 2 
  9.     logger: my_logger = partial(my_logger, count
  10.  
  11.     @logger() 
  12.     def main(self): 
  13.         return "in main function" 
  14.  
  15.  
  16. if __name__ == '__main__'
  17.     d = Demo() 
  18.     d.main() 

如果使用Python3.8那么可以直接忽略掉dataclass

 

  1. class Demo: 
  2.     countint = 2 
  3.     logger: my_logger = partial(my_logger, count
  4.  
  5.     @logger() 
  6.     def main(self): 
  7.         return "in main function" 

這樣我們就成功的解決了這個問題,突然想起來之前遇到的這個難題,現(xiàn)在算是解決了,希望對你有幫助。

責(zé)任編輯:華軒 來源: Python學(xué)習(xí)開發(fā)
相關(guān)推薦

2020-04-13 16:05:25

JS裝飾器前端

2024-09-12 15:32:35

裝飾器Python

2011-04-01 09:49:54

Python

2022-02-01 15:40:30

iOS漏洞安全

2014-04-08 09:49:27

PostgreSQL雙緩沖

2016-09-23 20:46:53

2021-08-09 10:24:21

技術(shù)分類數(shù)學(xué)

2019-12-02 11:27:35

攜號轉(zhuǎn)網(wǎng)號碼

2010-02-01 17:50:32

Python裝飾器

2021-04-20 11:03:26

人工智能AI機器學(xué)習(xí)

2022-09-07 10:20:05

Python裝飾類

2022-01-05 08:58:08

Python解釋器編程語言

2020-09-11 09:10:28

區(qū)塊鏈版權(quán)文化產(chǎn)業(yè)數(shù)字化

2022-07-01 16:08:32

區(qū)塊鏈區(qū)塊鏈技術(shù)

2019-11-28 08:42:31

攜號轉(zhuǎn)網(wǎng)網(wǎng)絡(luò)5G

2025-01-22 15:58:46

2021-04-11 08:21:20

Python@property裝飾器

2025-02-13 07:49:18

2019-06-17 08:21:06

RPC框架服務(wù)

2023-11-02 08:43:08

protocgo兼容
點贊
收藏

51CTO技術(shù)棧公眾號