Ошибка: "get" не является известным атрибутом "None" (reportOptionalMemberAccess)

Я использую PyRight для проверки моего кода на Django. Он жалуется на то, что


class FooForm(ModelForm):

    def clean(self):
        cleaned_data = super().clean()
        start = cleaned_data.get("start_date")  # <------- here

ошибка: "get" не является известным атрибутом "None" (reportOptionalMemberAccess)

Я установил django-stubs.

Как заставить PyRight осознать, что cleaned_data - это словарь?

Или что-то не так с моими настройками?

Ожидается, что метод clean() из ModelForm возвращает словарь, с точки зрения средства проверки типов, такого как Pyright, базовый класс super().clean() (вероятно, в общем случае) не является гарантированно сделаю это.

Вы можете попробовать явно ввести подсказку для переменной cleaned_data.

class FooForm(ModelForm):

def clean(self) -> Dict[str, Any]:
    cleaned_data: Dict[str, Any] = super().clean()
    start = cleaned_data.get("start_date")

django-stub Помечает его необязательным, как мы можем видеть в исходном коде:

class BaseForm(RenderableFormMixin):
    # ...
    def clean(self) -> dict[str, Any] | None: ...

Проблема обсуждается в выпуске #1403:

Подклассам Form разрешено не возвращать словарь, поэтому в поле type в form должно быть указано значение none. Смотрите предыдущую проблему #954. Пожалуйста, проверьте систему отслеживания проблем, прежде чем открывать проблемы.

Таким образом, вам разрешено переопределять def clean() и возвращать None, на самом деле это делает FormSet. Возможно, тогда программисту следует прокомментировать это, но, вероятно, с точки зрения проверки типов имеет смысл сделать это необязательным.

Вернуться на верх