Mypy 不会因缺少未实现的抽象方法而引发错误

问题描述 投票:0回答:1

使用 Mypy 对抽象类进行类型检查时,当子类缺少所需的抽象方法或属性时,不会引发错误。

预期行为:由于

Cat
没有实现
abstractmethod
eat
我希望 mypy 会引发错误。

实际行为:Mypy 对代码本身感到满意,即使在 --strict 下也是如此,并且不会引发错误。

我的环境

  • Python版本:3.8
  • Mypy版本:1.11.1
  • Mypy 命令行标志:--strict
from abc import ABCMeta, abstractmethod

class Animal(metaclass=ABCMeta):
    @abstractmethod
    def eat(self, food: str) -> None: pass

class Cat(Animal):
    pass
python python-typing mypy
1个回答
0
投票

正如 @STerliakov 和 @Barmar 在评论中回答的那样,

mypy
会发现,如果直接实例化(通过
Cat
),
Cat()
会缺少所需的抽象方法。

如果您希望

mypy
在声明
Cat
时给出错误,您可以将其声明为
@final
。然后,
mypy
将知道它不可子类化,并在声明时告诉您它必须实现
Animal
的所有必需的抽象方法。

至于错误发生在类声明还是实例化哪个好,这个要具体情况而定。如果您正在开发这个包供其他人使用,这可能意味着您永远不会自己实例化

Cat
。如果您在发布包之前运行
mypy
,则在类声明时出现的有关任何缺少抽象方法的错误会阻止您意外向包使用者发布不可实例化的类。

© www.soinside.com 2019 - 2024. All rights reserved.