Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Pylint无法处理抽象基类的抽象子类_Python 2.7_Pylint_Abc - Fatal编程技术网

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

Python 2.7 Pylint无法处理抽象基类的抽象子类,python-2.7,pylint,abc,Python 2.7,Pylint,Abc,我有一个具体的类MyConcreteClass,它是抽象类的子类 类MyABC2,该类又将另一个抽象类MyABC1子类化: import abc class MyABC1 (object): __metaclass__ = abc.ABCMeta @abc.abstractmethod def my_abstract_method (self): raise NotImplementedError("MyABC1.my_abstract_method")

我有一个具体的类
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\u abstract\u方法

/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
这是已知的bug吗?
也许我做错了什么?

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

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

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


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

如果我们可以将像
@abstractclass
这样的无操作修饰符作为信号发送给linters,那就太好了。