Pylance:“property”与“int”不兼容

2024-05-12

from typing_extensions import Protocol


class IFoo(Protocol):
    value: int


class Foo(IFoo):
    @property
    def value(self) -> int:
        return 2

    _value: int

    @value.setter
    def value(self, value: int):
        self._value = value

严格模式下的 Pylance(基本模式没有)在 getter 和 setter 处给出错误,指出:

“value”覆盖类“IFoo”中的同名符号 “property”与“int”不兼容。

我可以通过将协议更改为:

class IFoo(Protocol):
    @property
    def value(self) -> int:
        raise NotImplemented

但现在这使得它无效:

class Foo(IFoo):
    value: int

这没有意义,Foo 仍然拥有该属性value那是一个 int,为什么作为一个 getter 应该使它不同(在打字稿中这没有什么区别)? 我怎样才能解决这个问题?


正在阅读定义协议 https://peps.python.org/pep-0544/#defining-a-protocol相关 pep (PEP 544) 的部分,示例实现(在他们的情况下,class Resource)不直接继承自协议 - 他们的class SupportsClose用作类型提示验证器的引用类型。

你的例子也让人想起长期以来的zope.interface包,这个 PEP 也引用的 https://peps.python.org/pep-0544/#existing-approaches-to-structural-subtyping。请注意,PEP 的示例用法引用了以下示例(已删除无关行):

from zope.interface import Interface, implementer

class IEmployee(Interface):
   ...

@implementer(IEmployee)
class Employee:
   ...

The Employee类确实not直接子类化自IEmployee(对于新手 Zope/Plone 开发人员来说,这是一个常见的错误),它只是用zope.interface.implementer(IEmployee)类装饰器来表示该类Employee从接口实现IEmployee.

同样,请进一步阅读本节下的内容礼宾成员 https://peps.python.org/pep-0544/#protocol-members,我们有一个模板和具体类的示例(再次,示例被修剪):

from typing import Protocol

class Template(Protocol):
    name: str        # This is a protocol member
    value: int = 0   # This one too (with default)

class Concrete:
    def __init__(self, name: str, value: int) -> None:
        self.name = name
        self.value = value

var: Template = Concrete('value', 42)  # OK

再次请注意,Concrete实施确实not继承自Template,然而,变量var被表示为具有预期类型Template。请注意,Concrete可以将实例分配给它,因为它与定义的预期协议相匹配Template.

综上所述,鉴于您的示例,您可能希望定义class Foo:按原样而不是继承自IFoo正如您最初所做的那样,并填写类型信息,以便期望的事情IFoo在相关上下文中适当地进行类型提示(例如some_foo: IFoo = Foo(...) or def some_func(foo: IFoo):).

作为附录,您可能希望定义Foo像这样:

class Foo:
    _value: int

    @property
    def value(self) -> int:
        return 2

    @value.setter
    def value(self, value: int):
        self._value = value

拥有_value属性及其设置者之间的定义似乎令人困惑mypy due to 这个问题 https://github.com/python/mypy/issues/1465.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pylance:“property”与“int”不兼容 的相关文章

  • 按每个元素中出现的数字对字符串列表进行排序[重复]

    这个问题在这里已经有答案了 我有一个脚本 其目的是对不断下载到服务器上的空间数据集文件进行排序和处理 我的列表目前大致如下 list file t00Z wrff02 grib2 file t00Z wrff03 grib2 file t0
  • 使用ideone时如何传入命令行参数?

    我正在使用 ideone 在线解释器 http ideone com http ideone com 来测试一些 C 和 Python 程序 如何指定命令行参数而不是使用 STDIN 输入 看起来你不能 但是快速破解应该做的伎俩 stati
  • 在 Python 中延迟转置列表

    所以 我有一个延迟生成的可迭代的三元组 我试图弄清楚如何将其转换为 3 个可迭代对象 分别由元组的第一个 第二个和第三个元素组成 然而 我希望这件事能懒惰地完成 所以 举例来说 我希望 1 2 3 4 5 6 7 8 9 将变成 1 4 7
  • 创建 xyz 海拔数据的曲面图

    我正在尝试用 python 创建一座山的表面图 其中我有一些 xyz 数据 最终结果应该类似于that https i stack imgur com rKQV0 png 该文件的格式如下 616000 0 90500 0 3096 712
  • 我可以在 matplotlib 中的绘图左侧放置一个垂直颜色条吗?

    来自颜色条方法的 matplotlib 命令摘要 http matplotlib org api pyplot api html highlight colorbar matplotlib pyplot colorbar我知道关键字参数or
  • 在Python中将大文件(25k条目)加载到dict中很慢?

    我有一个大约有 25000 行的文件 它是 s19 格式的文件 每行就像 S214780010 00802000000010000000000A508CC78C 像这样的事情怎么样 我做了一个测试文件 只有一行S21478001000802
  • 删除 tkinter 文本默认绑定

    我正在制作一个简单的 tkinter 文本编辑器 但我想要所有默认绑定文本小部件如果可能的话删除 例如当我按Ctrl i它默认插入一个制表符 我制作了一个事件绑定来打印文本框中有多少行 我将事件绑定设置为Ctrl i以及 当我运行它时 它会
  • NumPy 数组与 SQLite

    我在 Python 中见过的最常见的 SQLite 接口是sqlite3 但是有什么东西可以很好地与 NumPy 数组或 rearray 配合使用吗 我的意思是 它可以识别数据类型 不需要逐行插入 并提取到 NumPy rec 数组中 有点
  • matplotlib:渲染到缓冲区/访问像素数据

    我想使用 matplotlib 生成的图作为 OpenGL 中的纹理 到目前为止 我遇到的 matplotlib 的 OpenGL 后端要么不成熟 要么已经停止使用 所以我想避免使用它们 我当前的方法是将图形保存到临时 png 文件中 并从
  • argparse 不检查位置参数

    我正在创建一个脚本 它使用 argparse 接受位置参数和可选参数 我已经阅读了 Doug 的教程和 python 文档 但找不到答案 parser argparse ArgumentParser description script t
  • 尝试校准keras模型

    我正在尝试通过 Sklearn 实现来校准我的 CNN 模型CalibratedClassifierCV 尝试将其包装为KerasClassifier并覆盖预测功能但没有成功 有人可以说我做错了什么吗 这是模型代码 def create m
  • 当元组列表中相同项目的值是字符串时,对它们的值求和

    如果我有这样的元组列表 my list books 5 books 10 ink 20 paper 15 paper 20 paper 15 我怎样才能把列表变成这样 books 15 ink 20 paper 50 即添加同一项目的费用
  • 为什么 pip 已经是最新的了却要求我升级?

    我全新安装了 python 3 7 1 64 位 并使用最新的 pyCharm 作为我的 IDE 我在这台机器上没有安装其他 python 我去安装 numpy 并收到以下消息 venv C Users John PycharmProjec
  • 使用具有可变数量索引的 numpy mggrid

    如何将 numpy mgrid 与可变数量的索引一起使用 我在 github 上找不到任何人将其与硬编码值以外的任何内容一起使用的示例 import numpy as np np mgrid 1 10 1 10 this works fin
  • “KMeans”对象没有属性“k”

    我使用 Yellowbrick 包绘制数据集的肘部曲线 以使用 KMeans 作为模型找到数据集的最佳簇数 我正在使用 Scikit learn KMeans 和 Yellowbrick kelbowvisualizer 函数 生成了肘部曲
  • Django 1.7:如何使用 html/css 文件作为模板发送电子邮件

    从 Django 1 7 开始 可以send email 使用新参数 html message 不幸的是 没有关于如何使用它的全面指南 新手友好 或者至少我找不到它 我需要使发送的电子邮件变得漂亮 因此 我试图弄清楚如何将我的消息包含到 h
  • 枚举

    我试图拥有一组扩展通用接口的枚举 例如 interface Fooable void someCommonMethod enum E1 implements Fooable some enumuerations and a definiti
  • python 中的 F 字符串前缀给出语法错误[重复]

    这个问题在这里已经有答案了 我有一个名为 method 的变量 它的值是 POST 但是当我尝试运行时print f method method is used 它不断在最后一个双引号处给出语法错误 我找不到它这样做的原因 我正在使用 py
  • 为数据集生成随机 JSON 结构排列

    我想生成 JSON 结构的许多不同排列作为同一数据集的表示 最好不需要对实现进行硬编码 例如 给定以下 JSON name smith occupation agent enemy humanity nemesis neo 应该产生许多不同
  • JSONDecodeError:额外数据:Python [重复]

    这个问题在这里已经有答案了 我使用以下代码从文件加载 json file file name obj list with open file as f for json obj in f obj list append loads json

随机推荐