Pylint 无法处理抽象基数 类 的抽象子 类
Pylint cannot handle abstract subclasses of abstract base classes
我有一个具体的 class MyConcreteClass
子class 是一个 抽象
class MyABC2
,反过来,子class是另一个抽象 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
不喜欢我没有在 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
这是一个已知错误吗?
也许我做错了什么?
Pylint 关于何时 class 是抽象的概念有点局限。基本上,它无法判断您希望 MyABC2
class 成为抽象 class。它的逻辑假设如果您不在 class 中声明任何用 @abstractmethod
(或加注 NotImplementedError
)装饰的方法,您希望 class 是具体的。在这种情况下,未能覆盖继承的抽象方法将是一个错误。
在 MyABC2
中声明元数据class 没有帮助。事实上,该声明完全是多余的,因为 subclass 从其父 class.
继承其 metaclass
这就是错误警告的原因。现在的问题是如何处理它。理想情况下,pylint 会更复杂一些,可以更好地处理这种情况,但解决这个问题会很困难。我真的不知道它如何区分不添加任何新抽象方法的中级抽象 class 和不正确实现的具体 class.
所以可能唯一的选择是禁用 class 的警告。尝试在 class 声明上方的代码中添加以下注释:# pylint: disable=W0223
。 (如果您将评论放在 class 中,我不确定。)
我有一个具体的 class MyConcreteClass
子class 是一个 抽象
class MyABC2
,反过来,子class是另一个抽象 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
不喜欢我没有在 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
这是一个已知错误吗? 也许我做错了什么?
Pylint 关于何时 class 是抽象的概念有点局限。基本上,它无法判断您希望 MyABC2
class 成为抽象 class。它的逻辑假设如果您不在 class 中声明任何用 @abstractmethod
(或加注 NotImplementedError
)装饰的方法,您希望 class 是具体的。在这种情况下,未能覆盖继承的抽象方法将是一个错误。
在 MyABC2
中声明元数据class 没有帮助。事实上,该声明完全是多余的,因为 subclass 从其父 class.
这就是错误警告的原因。现在的问题是如何处理它。理想情况下,pylint 会更复杂一些,可以更好地处理这种情况,但解决这个问题会很困难。我真的不知道它如何区分不添加任何新抽象方法的中级抽象 class 和不正确实现的具体 class.
所以可能唯一的选择是禁用 class 的警告。尝试在 class 声明上方的代码中添加以下注释:# pylint: disable=W0223
。 (如果您将评论放在 class 中,我不确定。)