python-2.7 - Pylint 无法处理抽象基类的抽象子类

标签 python-2.7 pylint abc

我有一个具体的类(class) 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不喜欢我没有定义 my_abstract_methodMyABC2 :

/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

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

最佳答案

Pylint 关于何时将类设计为抽象的概念有点有限。基本上,它无法判断您是否希望将 MyABC2 类作为抽象类。其逻辑假设,如果您没有在类中声明任何用 @abstractmethod 修饰的方法(或引发 NotImplementedError),则您希望该类是具体的。在这种情况下,未能重写继承的抽象方法将是一个错误。

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

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

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

关于python-2.7 - Pylint 无法处理抽象基类的抽象子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39256350/

相关文章:

python - 将长整型转换为字符串 Python

python - 在 Django 之外使用 Django ORM

抽象方法的 Python 不同行为

python : subclass `type` to create specialized types (e. g。一个 "list of int")

Python ABC 似乎允许不完整的实现

python - Python 中的彭博 API : How to Get Historical Reference Data

python - PYCHARM导入caffe报错

python - 在函数 : Wrong handling indentation/bad-continuation. 中使用列表作为参数的 Pylint 错误无法找出原因

python - pylint 没有这样的文件或目录

python - 防止 self 分配的 pylint 保护