Python 3: доступ к родительским атрибутам, ошибка линтера

У меня возникли проблемы с правильным доступом к родительским атрибутам в Python 3.8 с помощью VS Code и PyLint.

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

файл 1:

class Parent:
    def __init__(self, parentAttr):
        self.parentAttr= parentAttr

файл 2:

class Child(Parent):
    def __init__(self, parentAttr, childAttr):
        super().__init__(parentAttr)
        self.childAttr= childAttr

    def anyFunction(self):

В следующей строке (строка 7) Линтер подчеркивает self. красным и говорит:

Доступ к члену 'parentAttr' до его строки определения 8. pylint (доступ к члену перед определением)

        tmp = self.parentAttr
        self.parentAttr= tmp 

Код работает как надо. Но как мне правильно делать такие вещи, не получая этой ошибки?


person puzzled    schedule 21.08.2020    source источник


Ответы (2)


Вы уверены, что у вас нет опечатки в строке 7 файла 2 или в строке 3 файла 1? Вы импортируете родительский класс, который, по вашему мнению, вы импортируете? Я попытался воспроизвести вашу проблему, и vscode+pylint не жалуется на ваш код на моей машине.

введите здесь описание изображения

Честно говоря, я не понимаю, почему это так. Вы поступаете правильно, по крайней мере, в том псевдокоде, который вы дали. Если он жалуется, это должно быть из-за какой-то опечатки и потенциальной ошибки в вашем коде, которую вы еще не обнаружили.

person Olivier Roux    schedule 21.08.2020
comment
Я понимаю. Я поместил оба файла в меньший каталог (без изменений). Там у меня нет этих ошибок. Я понял, что импорт родительского класса каким-то образом определяется как ошибка из pylint. Не удалось импортировать родительский элемент (ошибка импорта). Там такая же структура папок. Странный. - person puzzled; 21.08.2020
comment
Я нашел проблему. В каталоге, где возникла проблема, проблема возникла из-за пустого автоматически сгенерированного файла init.py. Я удалил этот файл. Теперь это работает. - person puzzled; 21.08.2020

Я согласен с Оливье - я не могу воспроизвести это, учитывая ваш псевдокод, ни в одном файле, ни в нескольких файлах.

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

В более сложных примерах у вас есть такие варианты, как:

  1. создать фиктивный класс var (то есть вне функции инициализации), который перезаписывается при вызове __init__()
  2. вручную подавить предупреждение pylint, используя # pylint: disable=access-member-before-definition или форму короткого кода, если она у вас есть, например # pylint: disable=E1101
  3. исследовать абстрактные базовые классы
  4. получите подходящий плагин plyint для вашего конкретного варианта использования (например, django), который имеет дополнительную логику для обработки этих конкретных динамических атрибутов.
person kerasbaz    schedule 21.08.2020