当前位置: 首页 > 知识库问答 >
问题:

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

魏熠彤
2024-01-18

我有一个使用自定义装饰器的 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@executedef 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个答案

归明诚
2024-01-18

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

from typing import Callabledef execute(func) -> Callable[..., Result]:
 类似资料:
  • 问题内容: 我受够了在函数中不断重复输入相同的重复命令。我想知道我是否可以写一个装饰器为我做这项工作。这是我的问题的一个示例: 有什么方法可以自动将所有传递给函数的参数变成具有相同名称的实例变量?例如: 哪里会自动设置和。我该怎么办? 谢谢! 编辑:我应该提到我使用CPython 2.7。 问题答案: 这是我第一次尝试装饰器: 编辑第二尝试:我添加了处理变量的默认值和检查有效的关键字。 [编辑3:

  • Nest 是基于 装饰器 这种语言特性而创建的。在很多常用的编程语言中 装饰器 都是一个很大众的概念,但在 JavaScript 语言中这个概念却比较新。所以为了更好地理解装饰器是如何工作的,你应该看看 这篇 文章。下面给出一个简单的定义: ES2016 的装饰器是一个可以将目标对象,名称和属性描述符作为被修饰方法(returns function)的参数的表达式。你可以通过装饰器前缀 @ 来使用

  • 问题内容: 问题 我希望某些观点仅适用于网站的高级用户。 在项目中的各种应用程序中如何使用此装饰器? 问题答案: 你不必为此编写自己的装饰器,就像中已经包含的那样。 还有一个扩展此装饰器的代码段(),该代码段非常适合你的用例。 而且,要(重新)使用装饰器,只需将装饰器放在路径中的模块中,即可从任何其他模块导入它。

  • 问题内容: 我想定义一些通用装饰器,以在调用某些函数之前检查参数。 就像是: 旁注: 类型检查只是在这里显示一个示例 我正在使用Python 2.7,但是Python 3.0也会很有趣 问题答案: 从装饰器的功能和方法: Python 2 Python 3 在Python 3中已更改为,并且已更改为。 用法: 可以是或

  • 我试图修改几个类的字节代码,这些类的打包jar文件不在类路径中-它们是在给定URL的运行时由自定义的加载的。我尝试使用和来拦截那些类,但失败了。类加载器是遗留项目的一部分,因此我无法直接对其进行更改。 代理可以很好地处理AppClassLoader“本地”加载的类,但只会忽略那些由自定义类加载器加载的类。 CustomClassLoader: 我的代理中使用的ClassFileTransforme

  • 问题 你想使用一个装饰器去包装函数,但是希望返回一个可调用的实例。 你需要让你的装饰器可以同时工作在类定义的内部和外部。 解决方案 为了将装饰器定义成一个实例,你需要确保它实现了 __call__() 和 __get__() 方法。 例如,下面的代码定义了一个类,它在其他函数上放置一个简单的记录层: import types from functools import wraps class P