所以我在Python中创建了一个基于Python 2.7文档的简单自定义错误类:
class InvalidTeamError(Exception):
def __init__(self, message='This user belongs to a different team'):
self.message = message
这让我在PyLint中发出警告W0231: __init__ method from base class %r is not called
,所以我去查阅并给出非常有用的描述"所需的解释。"我通常只是忽略了这个错误,但我注意到在线代码包含了一个在自定义错误类的 init 方法开头的super调用,所以我的问题是:这样做实际上是为了一个目的还是只是人们试图安抚虚假警告?
答案 0 :(得分:14)
这是一个有效的pylint警告:如果不使用超类<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-sql</artifactId>
</dependency>
,您可能会错过父类中的实现更改。确实,你有 - 因为__init__
从Python 2.6开始就被弃用了。
这将是一个实现,它将避免您的警告W0231,并且还将避免python关于BaseException.message
属性的弃用警告。
message
这是一种更好的方法,因为implementation for BaseException.__str__
只考虑'args'元组,它根本不看消息。使用旧的实现,class InvalidTeamError(Exception):
def __init__(self, message='This user belongs to a different team'):
super(InvalidTeamError, self).__init__(message)
只打印一个空字符串,这可能不是你想要的!
答案 1 :(得分:-1)
在cpython2.7源代码中查看,避免调用超级 init 应该没有问题,是的,只是因为它通常是一个很好的做法来调用基类init你的初学者。
https://github.com/python/cpython/blob/master/Objects/exceptions.c参见第60行的BaseException init和第456行Exception如何从BaseException派生。