【问题标题】:Pylint cannot handle abstract subclasses of abstract base classesPylint 无法处理抽象基类的抽象子类
【发布时间】:2017-01-08 10:36:33
【问题描述】:

我有一个具体的类MyConcreteClass,它继承了一个抽象MyABC2,而后者又继承了另一个抽象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不喜欢我没有在MyABC2中定义my_abstract_method

/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

这是一个已知的错误吗? 也许我做错了什么?

【问题讨论】:

    标签: python-2.7 pylint abc


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 如果我们可以将像@abstractclass 这样的无操作装饰器作为信号发送给 linter,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 2018-07-11
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2016-12-28
    • 1970-01-01
    相关资源
    最近更新 更多