Pylint cannot handle abstract subclasses of abstract base classes

时间:2016-08-31 18:12:19

标签: python-2.7 pylint abc

I have a concrete class MyConcreteClass which subclasses an abstract class MyABC2, which, in turn, subclasses another abstract class MyABC1:

import abc

class MyABC1 (object):
    __metaclass__ = abc.ABCMeta
    @abc.abstractmethod
    def my_abstract_method (self):
        raise NotImplementedError("MyABC1.my_abstract_method")

class MyABC2 (MyABC1):
    __metaclass__ = abc.ABCMeta

class MyConcreteClass (MyABC2):
    def my_abstract_method (self):
        print "MyConcreteClass.my_abstract_method"

pylint does not like that I do not define my_abstract_method in MyABC2:

/usr/local/bin/epylint abctest.py
************* Module abctest
 abctest.py:9: warning (W0223, abstract-method, MyABC2) Method 'my_abstract_method' is abstract in class 'MyABC1' but is not overridden

Is this a known bug? Maybe I am doing something wrong?

1 个答案:

答案 0 :(得分:0)

Pylint关于何时一个类是抽象的概念有点受限。基本上,它无法告诉您,您希望MyABC2类是抽象类。它的逻辑假设如果你没有在类中声明用@abstractmethod(或者NotImplementedError}修饰的任何方法,那么你打算让这个类具体化。在这种情况下,未能覆盖继承的抽象方法将是一个错误。

MyABC2中声明元类并没有帮助。实际上,该声明完全是多余的,因为子类从其父类继承其元类。

这就是错误警告的原因。现在的问题是如何应对它。理想情况下,pylint会更复杂一些,并且可以更好地处理这种情况,但解决问题将很困难。我真的不知道它如何区分一个没有添加任何新抽象方法的中级抽象类和一个错误实现的具体类。

所以可能唯一的选择是禁用该类的警告。尝试将以下注释添加到类声明上方的代码中:# pylint: disable=W0223。 (如果你把评论放在课堂上,它也可能有用,我不确定。)