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

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

開發 后端
如何給裝飾器的參數傳參,這個問題曾經困擾我好久,雖然Python版本的更新,現在這個問題終于解決了,特此記錄。

 前言

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

[[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() 

輸出結果如下

 

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

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

好,現在問題來了?

如果給裝飾器的參數傳值呢,也就是說我的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() 

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

我們知道外界調用Demo類傳參的唯一途徑就是向__init__里進行傳參數,按照這個思路我們只能這么寫了,

 

  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.形式的參數,難道這個問題解決不了么?

問題解決

在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" 

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

責任編輯:華軒 來源: Python學習開發
相關推薦

2020-04-13 16:05:25

JS裝飾器前端

2014-04-08 09:49:27

PostgreSQL雙緩沖

2022-02-01 15:40:30

iOS漏洞安全

2016-09-23 20:46:53

2011-04-01 09:49:54

Python

2024-09-12 15:32:35

裝飾器Python

2019-12-02 11:27:35

攜號轉網號碼

2021-08-09 10:24:21

技術分類數學

2010-02-01 17:50:32

Python裝飾器

2021-04-20 11:03:26

人工智能AI機器學習

2020-09-11 09:10:28

區塊鏈版權文化產業數字化

2022-07-01 16:08:32

區塊鏈區塊鏈技術

2022-01-05 08:58:08

Python解釋器編程語言

2019-11-28 08:42:31

攜號轉網網絡5G

2022-09-07 10:20:05

Python裝飾類

2021-04-11 08:21:20

Python@property裝飾器

2025-01-22 15:58:46

2025-02-13 07:49:18

2017-01-12 09:40:47

2024-01-23 08:42:27

炎凰數據可視化監測容器云原生
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩一区二区三区在线观看 | 亚洲毛片在线观看 | 精品国产乱码久久久久久蜜退臀 | 国产亚洲精品美女久久久久久久久久 | 国产视频h | 精品免费在线 | 国产精品揄拍一区二区 | 国产成人免费视频网站高清观看视频 | 草比网站 | 精品欧美乱码久久久久久1区2区 | 国产清纯白嫩初高生视频在线观看 | 91大片| 国产伦精品一区二区三毛 | 色婷婷综合久久久久中文一区二区 | 国产成人精品一区二区三区四区 | 亚洲精品久久久久久首妖 | 一级做a爰片性色毛片16 | 99精品网| 成人在线免费视频 | 久色网 | 天天拍天天插 | www.日本国产 | 成年人黄色一级毛片 | 成人福利影院 | 欧美黄色免费网站 | 99精品久久久久久中文字幕 | 国产小视频在线 | 日韩不卡一二区 | 一区二区三区四区日韩 | 国产黄色av网站 | 99精品一区二区三区 | 青青久草 | 免费国产一区 | 伊人伊人 | 欧美一区二区三区国产精品 | 成人精品 | 综合成人在线 | 男女视频在线观看网站 | 国产精品一区二区免费 | 久久久性色精品国产免费观看 | 国产精品无码专区在线观看 |