Mypy 产生不兼容的签名错误,但满足里氏替换原则

2024-06-04

以下继承结构满足里氏替换原则(即,在本例中,接受任何 kwargs 并且不接受任何非关键字参数)。

class Parent:
    def mymethod(self, **kwargs) -> None:
        print("Called Parent mymethod")
    
class Child(Parent):
    def mymethod(self, *, arg1: int, **kwargs) -> None:
        print("Called Child mymethod")

但是,mypy 会产生错误:

error: Signature of "mymethod" incompatible with supertype "Parent"

Why?


Parent's mymethod声称至少采用 0 个关键字参数。要理解这一点,请看一下这个示例:

def mymethod(**kwargs) -> None:
    pass

mymethod()

mypy报告此操作成功,因为不需要命名关键字参数。len(kwargs)这里是 0。

你的例子表明Child's mymethod至少需要 1 个关键字参数,因为arg1是被迫提供的。为了:

def mymethod(*, named_kwarg, **kwargs) -> None:
    pass 

mymethod()

mypy报告:

error: Missing named argument "named_kwarg" for "mymethod"

您现在明白为什么会出现错误了吗?你的Parent's mymethod声明至少 0 个关键字参数。你的Childs mymethod至少声明 1 个关键字参数。里氏替换原则说超类的实例应该可以用子类的实例替换,但由于子类比超类提出了更严格的要求,mypy您的类型层次结构的错误。

If mypy报告成功,如果实例传递 0 个关键字参数将导致运行时错误Parent您正在处理的也恰好是一个实例Child.

为了进一步阐明这一点,如果我们改变Child's mymethod签名至:

def mymethod(self, *, arg1: Optional[int] = None, **kwargs) -> None:
    ...

mypy现在显示您的层次结构没有错误。这是因为我们已经声明了mymethod现在至少采用 0 个关键字参数而不是 1 个,使其像Parent根据里氏替代原理要求。

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

Mypy 产生不兼容的签名错误,但满足里氏替换原则 的相关文章

随机推荐

  • 列表理解按元素值重复列表中的元素

    我不太清楚执行此操作的代码 有类似的帖子 列表理解中的重复元素 https stackoverflow com questions 3925465 repeating elements in list comprehension 但我想按列
  • iOS 10.3 safari text-align:调整波斯语/阿拉伯语内容的错误

    在更新到 10 3 之前 我的网站在 iPhone 的所有移动浏览器上都能正常运行和查看 从我将 iOS 更新到 10 3 后 我的内容页面遇到了一个问题 内容被包装在 div CSS 属性为text align justify 我的内容在
  • 从 Angular 2 和 Silverlight 应用程序使用相同的 WCF 服务

    目前 我们有一个带有 WCF 服务 后端 的 Silverlight 应用程序 前端 现在 我们将用 Angular 2 应用程序替换 Silverlight 应用程序 而不更改 WCF 服务 只有 UI 会发生变化 在开始使用 Angul
  • ggplot 中的分层轴?

    我想知道是否可以在 GGLPOT2 或其他图形包 我只是更喜欢 ggplot 中制作分层 分段轴 我想要做的是获取下面的数据 制作一个堆积条形图 其中 x 轴上有周期 但在每个周期内 还有每种动物 那么每只动物内的条形颜色将是 颜色 变量
  • Dymola、空白和版本控制

    我在 Dymola 中打开了一个 Modelica 库 更改了一行 关闭 Dymola 并单击 全部保存 现在 TortoiseSVN 显示了数百个已更改的文件 而不是仅显示一个文件 其中更改了我想要执行的一行 所有这些变化要么是空格 要么
  • listview getChildAt() 返回 null

    我一直在做一个android项目并陷入了一个问题 我用谷歌搜索但没有找到答案 在我的项目中 有一个名为viewsurahfragment它包含一个 id 为的列表视图lv showquran 我想突出显示指定索引处的列表视图的视图 我正在使
  • Java 中的 64 位赋值在 32 位机器上是原子的吗?

    如果我有这样的代码 long x x 0xFFFFFFFFL 如果我在 32 位机器上运行此代码 它是否保证是原子的 或者读取 x 的不同线程是否可能获得不完整 垃圾值 这是简短的摘要 作为参考 读 写是ALWAYS原子 即使在 64 位实
  • 即使成功固定后,ParseQuery 在从本地数据存储查询时也给出 0 个对象

    我正在使用 parse com 的 Android SDK 并且遇到了一个特殊的问题 从片段的 onCreate 中 从服务器获取一个对象 Pin it 从本地数据存储中获取对象 以下是 onCreate 中的代码片段 ParseObjec
  • 使用 jest 测试 catch 块

    我如何测试下面我使用类的代码片段中的 catch 块 示例 js class Sample constructor data this resolvedData this retrieveData data retrieveData dat
  • 集成到 Windows 资源管理器上下文菜单中

    我想写一个小工具 它可以执行以下操作 当您右键单击具有特定文件扩展名的文件时 Windows 资源管理器上下文菜单会显示一个附加条目 当您单击此条目时 将启动某个 EXE 并以此文件作为其参数之一 我想为此使用 C NET 2 0 如果不可
  • 为什么用 < 对 JS 数字数组进行排序有效?

    在 JavaScript 中对数字数组进行排序时 我不小心使用了 lt 代替通常 https stackoverflow com questions 1063007 how to sort an array of integers corr
  • 如何在节点soap中查看请求和响应数据?

    我正在尝试使用肥皂API节点肥皂 https github com vpulim node soap 我的响应无法解析 我想知道如何查看控制台的请求和响应数据以简化错误查找过程 由于 Node Soap 使用请求库 因此可以通过以下方式对其
  • java 协变返回类型

    为什么下面的代码打印 1 class A int x 1 class B extends A int x 2 class Base A getObject System out println Base return new B publi
  • jQuery mouseover 显示隐藏的 div 并显示 div(如果鼠标仍在 div 上)

    我的鼠标悬停和鼠标移出功能有问题 当我将鼠标悬停在链接上时 它会显示隐藏的 div 当我将鼠标移出 div 时 它会隐藏该 div 问题是 如果我将鼠标悬停在链接上 然后将鼠标移动到不在 div 上方的其他位置 div 不会消失 如果我使用
  • 使用 setMessage() 在 AlertDialog 中显示多行文本和变量

    我需要在警报对话框中显示多行文本 如果我使用多个 setMessage 方法 则仅显示最后一个 setMessage 如下所示 final AlertDialog alertDialog new AlertDialog Builder th
  • 使用 data.table 而不是 data.frame 进行子集化

    我正在处理一个包含 300 万行和 10 列的数据框 并且正在对其进行一些子集化 我下面有一些玩具代码 当我子集化时 需要很长时间 如果我使用 data table 和 data table 上的子集会更快吗 这是一些玩具代码 s lt c
  • Docker 容器可以访问 DNS,但无法解析主机

    我在运行 docker 容器时遇到一个有趣的问题 突然间 我无法从容器内解析 DNS 这是一个概要 一切都没有解决 apt get pip 一次性 ping 容器等正在运行docker run it dns 8 8 8 8 ubuntu p
  • 具有定期更新的静态数据集的结构化流

    将流媒体与静态数据集合并是结构化流媒体的一个重要功能 但在每个批次中 数据集都会从数据源刷新 由于这些源并不总是那么动态 因此在指定的时间段 或批次数 内缓存静态数据集会提高性能 在指定的时间段 批次数之后 将从源重新加载数据集 否则从缓存
  • 如何使用 Mercurial 忘记所有已删除的文件

    我是 Mercurial 的新手 在清理项目中的图像文件夹后 我显示了大量文件 在 汞状态 中 我可以为每个输入 hg忘记 但必须有一个更简单的方法 那么我怎样才能告诉 Mercurial 忘记文件夹中所有已删除的 状态 文件呢 如果您也可
  • Mypy 产生不兼容的签名错误,但满足里氏替换原则

    以下继承结构满足里氏替换原则 即 在本例中 接受任何 kwargs 并且不接受任何非关键字参数 class Parent def mymethod self kwargs gt None print Called Parent mymeth