日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
終于解決了使用Python裝飾器中的一個痛點

 前言

在宿城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷,外貿(mào)網(wǎng)站制作,宿城網(wǎng)站建設(shè)費用合理。

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

疑問

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

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

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

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

輸出結(jié)果如下

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

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

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

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

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

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

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

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

我們知道外界調(diào)用Demo類傳參的唯一途徑就是向__init__里進行傳參數(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. from helper.log_helper import my_logger
  3. from dataclasses import dataclass
  4. @dataclass()
  5. class Demo:
  6.     count: int = 2
  7.     logger: my_logger = partial(my_logger, count)
  8.     @logger()
  9.     def main(self):
  10.         return "in main function"
  11. if __name__ == '__main__':
  12.     d = Demo()
  13.     d.main()

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

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

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


本文標題:終于解決了使用Python裝飾器中的一個痛點
瀏覽地址:http://www.dlmjj.cn/article/ccioojp.html