Python中抽象方法的静态类型检查

14

如何确保实现抽象方法的方法符合Python静态类型检查。在PyCharm中是否有一种方法可以在实现的方法返回类型不正确时报错?

class Dog:
    @abc.abstractmethod
    def bark(self) -> str:
        raise NotImplementedError("A dog must bark")

class Chihuahua(Dog):
    def bark(self):
        return 123

对于上述代码,我希望能得到某种提示,表明我的吉娃娃有问题。


https://docs.python.org/3/library/typing.html - Cyzanfar
我认为今天的正确答案是使用静态类型检查器,比如mypy。在JetBrains的IDE中有一个mypy插件 - undefined
1个回答

13

没有(简单的)方法来强制执行此操作。

实际上,Python的鸭子类型允许您覆盖bark的签名(参数和类型)。因此,Chihuahua.bark返回一个int是完全有效的代码(尽管不一定是良好的实践,因为它违反了LSP)。使用abc模块也无法改变这一点,因为它不强制执行方法签名

要“强制”类型,请将类型提示传递到新方法中,使其明确。这也会导致PyCharm显示警告。

import abc

class Dog:
    @abc.abstractmethod
    def bark(self) -> str:
        raise NotImplementedError("A dog must bark")

class Chihuahua(Dog):
    def bark(self) -> str:
        # PyCharm warns against the return type
        return 123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接