请考虑以下代码段:
class AbstractClass(object):
def method1(self):
raise NotImplementedError()
def method2(self):
raise NotImplementedError()
class SemiConcreteClass(AbstractClass):
def method1(self):
return True
class ConcreteClass(SemiConcreteClass):
def method2(self):
return True
使用默认配置(pylint classes.py
)运行对此文件的检查会产生一些丢失的文档字符串(让我们忽略它们)和此警告:
W:8,0:方法'method2'在类'AbstractClass'中是抽象的但是 没有覆盖(抽象方法)
我知道SemiConcreteClass
实际上是抽象的,应该进行细分以便使用,我不希望Pylint报告。如何配置Pylint将这些类视为另一个抽象类?类名的约定,类所在的模块 - 所有这些解决方案都没问题。
我知道我可以通过# pylint: disable=abstract-method
评论在课堂上明确地宣布警告。有更优雅的解决方案吗?
pylint 1.4.3,
astroid 1.3.6, common 0.63.2
Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)]
答案 0 :(得分:4)
不幸的是,在这种情况下,pylint还不够智能,我个人只是禁用警告,因为ConcreteClass
显然实现了这两种警告。另一种解决方案是让SemiConcreteClass
实现这两种方法,但这通常是你要避免的。
我没有使用Pylint检查,而是通常只使用Python Abstract Base Classes,而是会通知您未实现的方法。
示例:
#!/usr/bin/python
import abc
class AbstractClass(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def method1(self):
raise NotImplementedError()
@abc.abstractmethod
def method2(self):
raise NotImplementedError()
class SemiConcreteClass(AbstractClass):
def method1(self):
return True
SemiConcreteClass()
结果是:
Traceback (most recent call last):
File "test.py", line 22, in <module>
SemiConcreteClass()
TypeError: Can't instantiate abstract class SemiConcreteClass with abstract methods method2