如何解决使用自定义装饰器时Pylance 类型检测错误?

作者站长头像
站长
· 阅读数 4

我有一个使用自定义装饰器的 Python 代码片段,尽管代码成功运行,但在使用装饰的函数时,Pylance 一直显示警告。问题似乎与 Pylance 无法识别装饰的函数返回 Result[Any] 而不是 Select 有关。以下是代码:

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:  # 忽略
    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 发出警告,假设 query_data_source 函数返回 Select 而不是 Result[Any]。如何修改此代码以消除 Pylance 警告并准确传达装饰函数的返回类型?

其中 Session 是 sqlalchemy.orm 的 session 对象。DataSouce 是一张数据库表。

回复
1个回答
avatar
test
2024-06-21

加上这个试试,测试是可以的

from typing import Callable

def execute(func) -> Callable[..., Result]:
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容