Как устранить ошибку проверки типа места в 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