Подтвердить что ты не робот

"Правильный" способ определения исключения в Python без запроса PyLint

Я пытаюсь определить свой собственный (очень простой) класс исключений в Python 2.6, но независимо от того, как я это делаю, я получаю предупреждение.

Во-первых, самый простой способ:

class MyException(Exception):
    pass

Это работает, но выводит предупреждение во время выполнения: DeprecationWarning: BaseException.message устарел от Python 2.6 Хорошо, так что это не так. Затем я попытался:

class MyException(Exception):
    def __init__(self, message):
        self.message = message

Это также работает, но PyLint сообщает предупреждение: W0231: MyException.__init__: __init__ method from base class 'Exception' is not called. Поэтому я попробовал называть его:

class MyException(Exception):
    def __init__(self, message):
        super(Exception, self).__init__(message)
        self.message = message

Это тоже работает! Но теперь PyLint сообщает об ошибке: E1003: MyException.__init__: Bad first argument 'Exception' given to super class

Как, черт возьми, я делаю такую ​​простую вещь без каких-либо предупреждений?

4b9b3361

Ответ 1

Когда вы вызываете super, вам нужен класс подкласса/производного в качестве первого аргумента, а не основной/базовый класс.

Из онлайн-документации Python:

class C(B):
    def method(self, arg):
        super(C, self).method(arg)

Итак, ваше исключение будет определено следующим образом:

class MyException(Exception):
    def __init__(self, message):
        super(MyException, self).__init__(message)
        self.message = message

Ответ 2

Хорошо, я думаю, что понял это. Это, похоже, радует PyLint:

class MyException(Exception):
    def __init__(self, message):
        Exception.__init__(self, message)
        self.message = message

Ответ 3

Ваш первый способ должен работать. Я использую его сам все время в Python 2.6.5. Однако я не использую атрибут "сообщение"; возможно, поэтому в первом примере вы получаете предупреждение о запуске.

Следующий код, например, запускается без каких-либо ошибок или предупреждений во время выполнения:

class MyException(Exception):
    pass

def thrower():
    error_value = 3
    raise MyException("My message", error_value)
    return 4

def catcher():
    try:
        print thrower()
    except MyException as (message, error_value):
        print message, "error value:", error_value

Результат:

>>> catcher()
My message error value: 3

Я не знаю, будет ли проблема с PyLint проблемой выше.