Атрибут атрибута атрибута атрибута вне __init__

Я разделил свой конструктор классов, разрешив ему вызвать несколько функций, например:

class Wizard:
    def __init__(self, argv):
        self.parse_arguments(argv)
        self.wave_wand() # declaration omitted

    def parse_arguments(self, argv):
        if self.has_correct_argument_count(argv):
            self.name = argv[0]
            self.magic_ability = argv[1]
        else:
            raise InvalidArgumentsException() # declaration omitted

# ... irrelevant functions omitted

Пока мой переводчик с радостью запускает мой код, у Пилинта есть жалоба:

Instance attribute attribute_name defined outside __init__

Беглый поиск Google в настоящее время бесплоден. Сохранение всей логики конструктора в __init__ кажется неорганизованным, и выключение предупреждения Pylint также кажется взломанным.

Что такое / Pythonic способ решить эту проблему?

Ответ 1

Идея этого сообщения заключается в удобочитаемости. Мы ожидаем найти все атрибуты, которые может иметь экземпляр, прочитав его метод __init__.

Однако вы все же можете разделить инициализацию на другие методы. В этом случае вы можете просто назначить атрибуты None (с небольшим количеством документации) в __init__, а затем вызвать методы супериализации.

Ответ 2

Просто верните кортеж из parse_arguments() и распакуйте в атрибуты внутри __init__ по мере необходимости.

Кроме того, я бы рекомендовал использовать Исключения вместо exit(1). Вы получаете трассировку, ваш код можно использовать повторно и т.д.

class Wizard:
    def __init__(self, argv):
        self.name,self.magic_ability = self.parse_arguments(argv)

    def parse_arguments(self, argv):
        assert len(argv) == 2
        return argv[0],argv[1]