巧妙運用自定義裝飾器,規(guī)避Pylance類型檢查警告
python開發(fā)中,類型檢查工具(例如Pylance)常會發(fā)出警告,尤其是在使用自定義裝飾器時。如果裝飾器修改了函數(shù)的返回類型,類型檢查器可能無法準確識別,導(dǎo)致誤報。本文將講解如何解決這類類型檢查錯誤,確保類型注解的準確性。
問題剖析
假設(shè)我們有一個Python代碼片段,使用了自定義裝飾器execute,它包裝了名為query_data_source的函數(shù)。未經(jīng)裝飾的query_data_source函數(shù)返回類型為select,但經(jīng)過execute裝飾后,實際返回類型變?yōu)镽esult[Any]。然而,Pylance仍然認為query_data_source返回select,從而發(fā)出警告。
原始代碼如下:
def execute(func): def inner_wrapper(*args, **kwargs) -> result[any]: with session.begin() as session: result = session.execute(func(*args, **kwargs)) return result return inner_wrapper @execute def query_data_source( start_id: int = 1, max_results_amount: int = 10 ) -> select: # Pylance警告在此處產(chǎn)生 stmt = ( select( datasource.id, datasource.name, datasource.source_url, datasource.author, datasource.description, datasource.cover_image_url, datasource.start_date, datasource.end_date, ) .where(datasource.id >= start_id) .limit(max_results_amount) .order_by(datasource.id) ) return stmt
解決方案
為了消除Pylance警告并準確表達裝飾后函數(shù)的返回類型,我們需要修改execute裝飾器。關(guān)鍵在于明確指定裝飾后函數(shù)的返回類型。我們可以利用typing模塊中的Callable來實現(xiàn)。
修改后的execute裝飾器代碼:
from typing import Callable, Any def execute(func) -> Callable[..., Result]: def inner_wrapper(*args, **kwargs) -> Result[Any]: with Session.begin() as session: result = session.execute(func(*args, **kwargs)) return result return inner_wrapper
通過在execute裝飾器中使用Callable[…, Result]注解返回類型,我們明確告知類型檢查器,裝飾后的函數(shù)將返回Result類型。這樣,Pylance就能正確識別query_data_source函數(shù)的返回類型,從而消除警告。
此方法不僅能解決類型檢查錯誤,還能提升代碼的可讀性和可維護性,方便其他開發(fā)者理解代碼邏輯。
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END