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

終于解決了使用Python裝飾器中的一個(gè)痛點(diǎn)

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

 前言

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

[[346777]]

疑問

首先我有一個(gè)這樣的裝飾器文件路徑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 

然后我有個(gè)文件需要引用這個(gè)裝飾器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 

這個(gè)裝飾器的作用很簡(jiǎn)單,就是獲取當(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,這樣確實(shí)可以,我們還可以使用再簡(jiǎn)化一步

 

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

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

 

  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" 

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

 

  1. NameError: name 'self' is not defined 

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

問題解決

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

我們知道在Python3.7的時(shí)候引入了dataclasses,我們可以通過它來簡(jiǎn)化__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" 

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

責(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

2021-08-09 10:24:21

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

2022-02-01 15:40:30

iOS漏洞安全

2016-09-23 20:46:53

2014-04-08 09:49:27

PostgreSQL雙緩沖

2010-02-01 17:50:32

Python裝飾器

2019-12-02 11:27:35

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

2022-09-07 10:20:05

Python裝飾類

2022-01-05 08:58:08

Python解釋器編程語言

2021-04-20 11:03:26

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

2019-11-28 08:42:31

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

2021-04-11 08:21:20

Python@property裝飾器

2025-01-22 15:58:46

2020-09-11 09:10:28

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

2022-07-01 16:08:32

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

2025-02-13 07:49:18

2024-05-10 12:33:06

flask裝飾器

2019-06-17 08:21:06

RPC框架服務(wù)
點(diǎn)贊
收藏

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