首页 > 编程问答 >如何注释可以实现为属性的属性?

如何注释可以实现为属性的属性?

时间:2024-07-30 13:56:14浏览次数:11  
标签:python python-typing mypy

我试图让 mypy 对我的类型注释感到满意。这是一个最小的例子:

class FooInterface:
    x: int


class FooWithAttribute(FooInterface):
    x: int = 0


class FooWithProperty(FooInterface):
    @property
    def x(self) -> int:
        return 0

以我人类的理解,一切都很好: FooWithAttribute().x FooWithProperty().x 都将返回 0 ,即 int ,没有类型错误。然而mypy抱怨:

error: Signature of "x" incompatible with supertype "FooInterface"

有没有办法告诉mypy一切都好?现在我发现的唯一方法是在 x: typing.Any 中注释 FooInterface ,这浪费了x是int的信息。


遇到的问题是,虽然 FooWithAttribute FooWithProperty 在运行时都表现出相同的行为,但在类型系统看来,它们是不同的。 mypy 正在正确地标记此差异。

以下是解决此问题的几种方法:

1. 使用 @property 装饰器定义 FooInterface 中的 x

from __future__ import annotations
class FooInterface:
    @property
    def x(self) -> int:
        ...

class FooWithAttribute(FooInterface):
    x: int = 0

class FooWithProperty(FooInterface):
    @property
    def x(self) -> int:
        return 0

这明确告诉 mypy x FooInterface 中应该是一个属性,从而使子类实现保持一致。

2. 使用 typing.Protocol 定义接口:

from typing import Protocol

class FooInterface(Protocol):
    @property
    def x(self) -> int:
        ...

class FooWithAttribute(FooInterface):
    x: int = 0

class FooWithProperty(FooInterface):
    @property
    def x(self) -> int:
        return 0

这利用了结构子类型(structural subtyping), mypy 只检查接口定义的方法和属性是否存在,而不管实际的继承关系。

3. 使用类型存根文件 ( *.pyi ):

如果无法修改原始代码,可以创建一个类型存根文件来描述 FooInterface 的预期行为:

# foo_interface.pyi
class FooInterface:
    @property
    def x(self) -> int:
        ...

将此文件与的代码放在同一个目录中, mypy 会自动使用它进行类型检查。

选择哪种方法取决于的具体需求和代码库的结构。

标签:python,python-typing,mypy
From: 58349417

相关文章

  • PIL 和 python 静态类型
    我有一个函数参数,它可以接受图像的多种类型:defsomefunc(img:Union[np.array,Image,Path,str]):PILImage在这种情况下抛出以下异常:TypeError:Union[arg,...]:eachargmustbeatype.Got<module'PIL.Image'from...进一步检查图像对象后这才有......
  • 学会用Python爬取小说网站,想看什么就爬什么,广告也不用看了~
    今天以爬取笔趣阁小说网站为例,练习Python爬虫技术。通过这个爬虫,可以完成批量爬取一本小说的所有章节,并将所有章节内容按顺序保存到一个txt文档内,下面我们就开始吧。首先,百度搜索“笔趣阁”,发现有很多网站都叫笔趣阁。我们可以随便挑选一个网站尝试,本文我以‘https://......
  • 计算机毕业设计django+vue《Python数据分析》的教学系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今数字化时代,数据分析已成为各行各业不可或缺的技能之一,而Python作为数据分析领域的首选语言,其重要性日益凸显。然而,传统的教学模式在......
  • 如何将多个变量分配给 python 函数中的单个参数?
    我正在尝试编写一个程序,如果可能的话,它需要一个三项式并对其进行因式分解。每当用户输入A、B和C时,三项式应该通过Factor(product,summation)函数获取,但我似乎无法弄清楚如何将A和C分配给乘积arg,将B分配给我尝试在函数外部声明不同的变量,product=(a*c)和summati......
  • python - 从文本生成音乐
    请给我一些建议为了解释一下,我输入“深度睡眠的睡眠音乐”,它将返回一个wav文件:https://www.youtube.com/watch?v=1wAdQhFJy54或者我给出一个wav文件,它会返回相同的现在这是我尝试过的:https://github.com/facebookresearch/audiocraft......
  • 当 functools.wraps() 用于泛型函数时,Mypy 1.10 报告错误
    TLDR;我有一个装饰器:更改函数签名包装的函数使用一些泛型类型参数除了我想使用的签名funtools.wraps以保留其余部分信息。有什么办法可以在不抱怨的情况下实现这一目标吗?mypy更多背景一个最小的工作示例如下所示:这......
  • 从零开始的Python开发日记(7):短信验证功能开发流程
    短信验证功能开发流程在开发一个包含登录、注册以及短信验证的功能时,你需要遵循一个系统的开发流程。以下是实现这一功能的基本步骤,包括所需的技术和代码示例。1.环境配置首先,确保你的开发环境已经配置好,并安装了必要的库和工具。pipinstallfastapiuvicornsqlalche......
  • 【Python数值分析】革命:引领【数学建模】新时代的插值与拟合前沿技术
    目录​编辑第一部分:插值的基本原理及应用1.插值的基本原理1.1插值多项式1.2拉格朗日插值 1.3牛顿插值 1.4样条插值2.插值的Python实现2.1使用NumPy进行插值2.2使用SciPy进行插值2.2.1一维插值​编辑2.2.2二维插值3.插值的应用场景3.1数据平......
  • 在家用电脑上设置 Python 和 Jupyter,尝试打开 Jupyter 笔记本并显示错误,无法获取
    我有最新的Python版本3.12.4和以下版本的Jupyter:SelectedJupytercorepackages...IPython:8.26.0ipykernel:6.29.5ipywidgets:notinstalledjupyter_client:8.6.2jupyter_core:5.7.2jupyter_server:2.14.2jupyterlab......
  • Python - Reloading a module
    Eachmoduleisloadedintomemoryonlyonceduringaninterpretersessionorduringaprogramrun,regardlessofthenumberoftimesitisimportedintoaprogram.Ifmultipleimportsoccur,themodule’scodewillnotbeexecutedagainandagain.Suppose......