2016-08-09 2 views
8

Так у меня есть простой пользовательский класс ошибок в Python, который я создал на основе Python 2.7 документации:Что такое вызов супер в пользовательских классах ошибок в python?

class InvalidTeamError(Exception): 
    def __init__(self, message='This user belongs to a different team'): 
     self.message = message 

Это дает мне предупреждение W0231: __init__ method from base class %r is not called в PyLint так что я иду искать его, и я дал очень полезное описание «Необходимое объяснение». Я бы просто проигнорировал эту ошибку, но я заметил, что тонкий код онлайн включает вызов супер в начале init метод пользовательских классов ошибок, поэтому мой вопрос: делает ли это на самом деле цель или это просто люди пытаются успокоить фальшивое предупреждение?

ответ

10

Это действительное предупреждение pylint: если вы не используете суперкласс __init__, вы можете пропустить реализацию изменений в родительском классе. И действительно, у вас есть - потому что BaseException.message устарел от Python 2.6.

Здесь была бы реализация, которая позволит избежать вашего предупреждения W0231, а также избежать предупреждения о стирании python относительно атрибута message.

class InvalidTeamError(Exception): 
    def __init__(self, message='This user belongs to a different team'): 
     super(InvalidTeamError, self).__init__(message) 

Это лучший способ сделать это, потому что implementation for BaseException.__str__ рассматривает только кортеж «арг», он не смотрит на сообщения на всех. С вашей старой реализацией print InvalidTeamError() напечатал бы только пустую строку, которая, вероятно, не та, что вы хотели!

+0

Огромные пальцы вверх для ссылки на реализацию C. Делает это сразу же ясно, что происходит! – timmwagener

-1

Lookinv в исходном коде cpython2.7 не должно быть проблем с этим вызовом для супер init, и да, это сделано только потому, что в целом это хорошая практика для вызова init базового класса в init.

https://github.com/python/cpython/blob/master/Objects/exceptions.c см. Строку 60 для инициализации BaseException и строки 456, как исключение происходит из BaseException.

Смежные вопросы