Как устранить ошибку проверки типа места в VSCode в Django

Я сталкиваюсь с ошибкой проверки типов в VSCode с помощью Place при доступе к serializer.validated_data["code"] в проекте Django. Ошибки следующие:

  • "__getitem__" method not defined on type "empty" Pylance
  • Object of type "None" is not subscriptable Pylance

Тип свойства определяется как:
(property) validated_data: empty | Unknown | dict[Unknown, Unknown] | Any | None

Настройки кода VS:

"python.languageServer": "Pylance",
"python.analysis.typeCheckingMode": "basic"

Я определил класс сериализатора следующим образом,

class InputSerializer(BaseSerializer):
        code = serializers.CharField(
            required=True,
            max_length=255,
            validators=[voucher_code_validator],
        )

Как я могу это исправить?

Это немного зависит от используемых вами заглушек. С помощью (mypy) https://github.com/typeddjango/djangorestframework-stubs вы не должны получать эту ошибку, поскольку validated_data вводится как Any. Я бы подумал, что может быть эквивалент для pyright (который использует Pylance).

С другими (нет?) заглушками существует множество возможностей, т.е. те, которые вы перечислили empty | Unknown | dict[Unknown, Unknown] | Any | None. Чтобы выполнить проверку типов, вам нужно обработать empty | None. Вы могли бы, например, добавить строку:

assert serializer.validated_data is not None
assert serializer.validate_data is not empty # import from fields

ИЛИ вы уверяете, что у вас действительно есть здесь dict:

assert isinstance(serializer.validated_data, dict)

Альтернативы:

  • напишите свое собственное свойство validated_data с более точным типом возвращаемого значения (и возможными проверками).
  • Небезопасный, но самый быстрый способ: используйте typing.cast
Вернуться на верх