Пилинт, дающий не вызываемую ошибку для свойства объекта, которое вызывается - PullRequest
0 голосов
/ 03 декабря 2018

Не уверен, что я делаю что-то не так или это проблема с pylint.В приведенном ниже коде я получаю ошибку, что self.type не вызывается E1102.

Хотя я мог бы просто проигнорировать это и продолжать работать, похоже, что такого рода вещи должно быть легко исправить ...просто не могу понять, как это исправить.

from typing import Callable


class Thing:
    def __init__(self, thing_type: Callable):
        self._type = thing_type
        self._value = None

    @property
    def type(self) -> Callable:
        return self._type

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, value):
        self._value = self.type(value)

enter image description here

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Если self._type является классом (а не экземпляром), вы можете вместо этого добавить к нему type.type - это по умолчанию метакласс в Python.

Pylint должен справиться с этим лучше - он знает, что вы можете вызвать класс для создания экземпляра.

class Thing:
    def __init__(self, thing_type: type):
        self._type: type = thing_type
        self._value = None

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, value):
        self._value = self._type(value)

Обратите внимание, что я также включил переменную аннотацию, для которой требуется python 3.6.

Также обратите внимание, что если вы нигде не включите type.setter, python сам решит, что тип не может быть установлен.Если вы затем ссылаетесь на _type в своем конструкторе (что вы делаете прямо сейчас), то вы уже обойдете его, не устанавливая.

Редактирование: Я изменил value.setter, чтобы вместо него использовать self._type.Поскольку это частная переменная для экземпляра, это прекрасно для использования.Это останавливает появление точки E1102.

Удаление свойства type приведет к удалению E0601.Это связано с тем, что ваше свойство в пространстве имен класса скрывает глобальную переменную с именем type.Если он определен, Pylint думает, что вы намереваетесь использовать свойство (которое в этот момент является экземпляром класса property, а не свойством класса).

0 голосов
/ 03 декабря 2018

Оставим этот ответ на некоторое время неприемлемым, но я понял, что он как-то связан с использованием декоратора @property.В процессе создания нового свойства объекта информация подсказки типа теряется в pylint, а intellisense VSCode, похоже, не работает.Используя синтаксис свойства старого стиля, я получаю правильную строчку и подсказку типа (см. Изображение ниже)

Кажется немного позором, но я надеюсь, что кто-то придумает лучший ответ

enter image description here

...