Почему компания Pylint жалуется на отсутствие Exception.message? - PullRequest
1 голос
/ 22 мая 2019

Я обычно объявляю базовое исключение для моих модулей, которое ничего не делает, из этого я извлекаю пользовательские ошибки, которые могут иметь дополнительные пользовательские данные: AFAIK, это правильный путь для использования исключений в Python.

Я также привык создавать удобочитаемое сообщение из этой пользовательской информации и передавать его, чтобы я мог ссылаться на это сообщение в обработчиках ошибок. Это пример:

# this code is meant to be compatible with Python-2.7.x

class MycoolmoduleException(Exception):
'''base Mycoolmodule Exception'''

class TooManyFoo(MycoolmoduleException):
'''got too many Foo things'''
def __init__(self, foo_num):
    self.foo_num = foo_num
    msg = "someone passed me %d Foos" % foo_num
    super(TooManyFoo, self).__init__(msg)

# .... somewhere else ....
try:
    do_something()
except Exception as exc:
    tell_user(exc.message)

# real world example using Click
@click.command()
@click.pass_context
def foo(ctx):
    '''do something'''
    try:
        # ... try really hard to do something useful ...
    except MycoolmoduleException as exc:
        click.echo(exc.message, err=True)
        ctx.exit(-1)

Теперь, когда я запускаю этот код через pylint-2.3.1, он жалуется на мое использование MycoolmoduleException.message:

coolmodule.py:458:19: E1101: Instance of 'MycoolmoduleException' has no 'message' member (no-member)

Такой код всегда работал для меня (как в Python2, так и в Python3), и hasattr(exc, 'message') в одном и том же коде возвращает True, так почему же Pylint жалуется? И / или: как улучшить этот код?

(Примечание: то же самое происходит, если я пытаюсь поймать встроенный Exception вместо своего MycoolmoduleException)

...