在python中调用自定义错误类中的super是什么意思?

时间:2016-08-09 17:14:36

标签: python python-2.7 exception pylint

所以我在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调用,所以我的问题是:这样做实际上是为了一个目的还是只是人们试图安抚虚假警告?

2 个答案:

答案 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派生。