如何使用自定義裝飾器避免Pylance類型檢測錯誤?

如何使用自定義裝飾器避免Pylance類型檢測錯誤?

巧妙運用自定義裝飾器,規(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)聲明
THE END
喜歡就支持一下吧
點贊12 分享