«Правильный» способ определения исключения в Python без жалоб PyLint - PullRequest
25 голосов
/ 25 мая 2010

Я пытаюсь определить свой собственный (очень простой) класс исключений в 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

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

Ответы [ 3 ]

36 голосов
/ 25 мая 2010

Когда вы вызываете 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
7 голосов
/ 25 мая 2010

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

class MyException(Exception):
    def __init__(self, message):
        Exception.__init__(self, message)
        self.message = message
0 голосов
/ 25 мая 2010

Ваш первый способ должен работать. Я использую это все время в 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 проблема с вышеуказанным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...