Python Pylint W0223:方法。。。在课堂上是抽象的。。。但并没有被推翻

Python Pylint W0223:方法。。。在课堂上是抽象的。。。但并没有被推翻,python,pylint,Python,Pylint,Pylint为抽象类的子类生成此错误,即使这些子类本身没有实例化,并且方法在具体子类中被重写。为什么派林认为我的抽象子类是具体的?我如何才能关闭此警告,而不在rc文件中取出锤子并完全禁用它?出于某种原因,pylint认为该类不是抽象的(通常通过检查引发NotImplementedError的方法来进行检测)。在模块(仅用于在该模块中禁用)或类(仅在此类中禁用)的顶部添加类似于#pylint:disable=W0223的注释,应该这样做。为了关闭错误的抽象方法警告,您可以使用abc.abc超类来实

Pylint为抽象类的子类生成此错误,即使这些子类本身没有实例化,并且方法在具体子类中被重写。为什么派林认为我的抽象子类是具体的?我如何才能关闭此警告,而不在rc文件中取出锤子并完全禁用它?

出于某种原因,pylint认为该类不是抽象的(通常通过检查引发NotImplementedError的方法来进行检测)。在模块(仅用于在该模块中禁用)或类(仅在此类中禁用)的顶部添加类似于
#pylint:disable=W0223的注释,应该这样做。

为了关闭错误的
抽象方法
警告,您可以使用
abc.abc
超类来实现抽象类,而不是使用
abc.ABCMeta
元类

例如,此代码将引发警告:

from abc import ABCMeta, abstractmethod


class Parent:
    __metaclass__ = ABCMeta

    @abstractmethod
    def do_something(self):
        pass


class Child(Parent):
    __metaclass__ = ABCMeta

但这不会:

from abc import ABC, abstractmethod


class Parent(ABC):

    @abstractmethod
    def do_something(self):
        pass


class Child(Parent, ABC):
    pass


小心!对于ABC超类和多重继承,你必须注意潜在的方法解决顺序(MRO)问题。

OK,所以答案是PyLink的检测机制是有缺陷的,因为它不考虑元类。我知道我可以在模块级别禁用,但在当前形式下,这似乎不是一个有用的检查。注意:不是完全相同的问题,但作为记录,当在抽象类中引发
NotImplementedError
的方法在子类中未被重写时,我会收到此警告,即使对抽象方法上的
@abstractmethod
装饰器进行了注释。在Python 3.7和Pylint 2.3.1中,当抽象类的方法引发
NotImplementedError
并在不重写它的情况下对其进行子类化时,我也会遇到此错误,即使该方法不可能被调用,并且它没有被
@abstractmethod
修饰。