Visual Studio Code
Pydantic хорошо работает с любым редактором или IDE, поскольку он создан поверх стандартных аннотаций типов Python.
При использовании Visual Studio Code (VS Code) поддерживаются некоторые дополнительные функции редактора , сравнимые с теми, которые предоставляет плагин PyCharm .
Это означает, что у вас будет автозаполнение (или «IntelliSense») и проверка ошибок для типов и обязательных аргументов даже при создании новых экземпляров модели Pydantic.
Настроить код VS¶
Чтобы воспользоваться этими функциями, вам необходимо правильно настроить VS Code, используя рекомендуемые настройки.
Если у вас другая конфигурация, вот краткий обзор шагов.
Установить Пайланс¶
Вам следует использовать расширение Pylance для VS Code. Это рекомендуемый официальный плагин VS Code нового поколения для Python.
Pylance по умолчанию устанавливается как часть расширения Python для VS Code , поэтому, вероятно, он должен работать. В противном случае вы можете дважды проверить, установлен ли он и включен ли он в вашем редакторе.
Настройте свою среду¶
Затем вам необходимо убедиться, что ваш редактор знает среду Python (возможно, виртуальную среду) для вашего проекта Python.
Это будет среда, в которой вы установили Pydantic.
Настроить Пиланс¶
В конфигурациях по умолчанию вы получите поддержку автозаполнения, но Pylance может не проверять ошибки типов.
Вы можете включить проверку ошибок типа в Pylance, выполнив следующие действия:
- Откройте «Настройки пользователя».
- Поиск
Type Checking Mode
- Вы найдете вариант под
Python › Analysis: Type Checking Mode
- Установите
basic
илиstrict
(по умолчаниюoff
).
Теперь вы получаете не только автодополнение при создании новых экземпляров модели Pydantic, но и проверку ошибок для обязательных аргументов .
И вы также получите проверки ошибок для недопустимых типов данных .
!!! примечание «Технические подробности» Pylance — это расширение VS Code с закрытым исходным кодом, но его можно использовать бесплатно. В основе Pylance используется инструмент с открытым исходным кодом (также от Microsoft) под названием Pyright , который выполняет всю тяжелую работу.
You can read more about it in the [Pylance Frequently Asked Questions](https://github.com/microsoft/pylance-release/blob/main/FAQ.md#what-is-the-relationship-between-pylance-pyright-and-the-python-extension).
Настроить mypy¶
Вы также можете настроить mypy в VS Code, чтобы встроенная проверка ошибок mypy в вашем редакторе (альтернативно/дополнительно к Pylance).
Сюда будут включены ошибки, обнаруженные плагином Pydantic mypy , если вы его настроили.
Чтобы включить mypy в VS Code, сделайте следующее:
- Откройте «Настройки пользователя».
- Поиск
Mypy Enabled
- Вы найдете вариант под
Python › Linting: Mypy Enabled
- Установите флажок (по умолчанию он снят)
Советы и рекомендации¶
Вот несколько дополнительных советов и рекомендаций, которые помогут вам улучшить работу разработчика при использовании VS Code с Pydantic.
Строгие ошибки¶
Эта дополнительная поддержка редактора работает следующим образом: Pylance будет обрабатывать ваши модели Pydantic так, как если бы они были чистыми dataclasses
Python.
И он будет отображать строгую проверку ошибок типов для типов данных, передаваемых в аргументах при создании нового экземпляра модели Pydantic.
В этом примере вы можете видеть, что str
'23'
не является допустимым int
для аргумента age
.
Он ожидает age=23
вместо age='23'
.
Тем не менее, дизайн и одна из основных особенностей Pydantic заключается в том, что он очень снисходителен к типам данных .
Фактически он примет str
со значением '23'
и преобразует его в int
со значением 23
.
Эти строгие проверки ошибок в большинстве случаев очень полезны и могут помочь вам обнаружить множество ошибок на ранней стадии . Но есть случаи, например, age='23'
, когда они могут быть неудобными, сообщая о «ложноположительной» ошибке.
Приведенный выше пример с age='23'
намеренно прост, чтобы показать ошибку и различия в типах.
Но более распространенными случаями, когда эти строгие ошибки могут быть неудобными, являются случаи использования более сложных типов данных, таких как значения int
для полей datetime
или значения dict
для подмоделей Pydantic.
Например, это справедливо для Pydantic:
from pydantic import BaseModel
class Knight(BaseModel):
title: str
age: int
color: str = 'blue'
class Quest(BaseModel):
title: str
knight: Knight
quest = Quest(
title='To seek the Holy Grail', knight={'title': 'Sir Lancelot', 'age': 23}
)
Тип полевого knight
объявляется с помощью класса Knight
(модель Pydantic), а вместо этого код передает буквальный dict
. Это по-прежнему справедливо для Pydantic, и dict
будет автоматически преобразован в экземпляр Knight
.
Тем не менее, это будет обнаружено как ошибка типа:
В таких случаях существует несколько способов отключить или игнорировать строгие ошибки в очень конкретных местах, сохраняя при этом их в остальной части кода.
Ниже приведены несколько методов достижения этой цели.
Отключить проверку типов в строке¶
Вы можете отключить ошибки для конкретной строки, используя комментарий:
# type: ignore
или (если говорить конкретно о pylance/pyright):
# pyright: ignore
( pyright — это языковой сервер, используемый Pylance.).
возвращаясь к примеру с age='23'
, это будет:
from pydantic import BaseModel
class Knight(BaseModel):
title: str
age: int
color: str = 'blue'
lancelot = Knight(title='Sir Lancelot', age='23') # pyright: ignore
таким образом Pylance и mypy будут игнорировать ошибки в этой строке.
Плюсы : это простое изменение этой строки, чтобы удалить ошибки.
Минусы : любая другая ошибка в этой строке также будет опущена, включая проверки типов, аргументы с ошибками, неуказанные обязательные аргументы и т. д.
Переопределить тип переменной¶
Вы также можете создать переменную со значением, которое хотите использовать, и явно объявить ее тип с помощью Any
.
from typing import Any
from pydantic import BaseModel
class Knight(BaseModel):
title: str
age: int
color: str = 'blue'
age_str: Any = '23'
lancelot = Knight(title='Sir Lancelot', age=age_str)
таким образом Pylance и mypy будут интерпретировать переменную age_str
так, как если бы они не знали ее типа, вместо того, чтобы знать, что она имеет тип str
, когда ожидалось int
(а затем показывать соответствующую ошибку).
Плюсы : ошибки будут игнорироваться только для определенного значения, и вы все равно увидите дополнительные ошибки для других аргументов.
Минусы : требуется импортировать Any
и новую переменную в новой строке для каждого аргумента, который требует игнорирования ошибок.
Переопределить тип значения с помощью cast
¶
Ту же идею из предыдущего примера можно поместить в ту же строку с помощью cast()
.
Таким образом, объявление типа значения переопределяется встроенным, без необходимости использования другой переменной.
from typing import Any, cast
from pydantic import BaseModel
class Knight(BaseModel):
title: str
age: int
color: str = 'blue'
lancelot = Knight(title='Sir Lancelot', age=cast(Any, '23'))
cast(Any, '23')
не влияет на значение, это по-прежнему просто '23'
, но теперь Pylance и mypy будут предполагать, что оно имеет тип Any
, что означает, что они будут действовать так, как если бы они не знали тип стоимости.
Итак, это эквивалент предыдущего примера, без дополнительной переменной.
Плюсы : ошибки будут игнорироваться только для определенного значения, и вы все равно увидите дополнительные ошибки для других аргументов. Нет необходимости в дополнительных переменных.
Минусы : требуется импорт Any
и cast
, и если вы не привыкли использовать cast()
, поначалу это может показаться странным.
Конфигурация в аргументах класса¶
Pydantic имеет богатый набор Конфигураций модели.
Эти конфигурации можно установить во внутреннем class Config
на каждой модели:
from pydantic import BaseModel
class Knight(BaseModel):
model_config = dict(frozen=True)
title: str
age: int
color: str = 'blue'
или передается в качестве аргументов ключевого слова при определении класса модели:
from pydantic import BaseModel
class Knight(BaseModel, frozen=True):
title: str
age: int
color: str = 'blue'
Конкретная frozen
конфигурация (в бета-версии) имеет особое значение.
Он не позволяет другому коду изменять экземпляр модели после его создания, сохраняя его «замороженным» .
При использовании второй версии для объявления frozen=True
(с ключевыми аргументами в определении класса) Pylance может использовать ее, чтобы помочь вам проверить код и обнаружить ошибки, когда что-то пытается установить значения в «замороженной» модели.
Добавление значения по умолчанию с помощью Field
¶
Pylance/pyright требует, чтобы default
было аргументом ключевого слова для Field
, чтобы сделать вывод, что поле является необязательным.
from pydantic import BaseModel, Field
class Knight(BaseModel):
title: str = Field(default='Sir Lancelot') # this is okay
age: int = Field(
23
) # this works fine at runtime but will case an error for pyright
lance = Knight() # error: Argument missing for parameter "age"
Это ограничение преобразований классов данных, которое нельзя исправить в pydantic.
Технические детали¶
!!! предупреждение. Как пользователю Pydantic, вам не нужны приведенные ниже сведения. Не стесняйтесь пропустить остальную часть этого раздела.
These details are only useful for other library authors, etc.
Эта дополнительная поддержка редактора работает путем реализации предложенного проекта стандарта Dataclass Transform (PEP 681) .
Предлагаемый черновой вариант стандарта написан Эриком Траутом из команды Microsoft, тем же автором пакета с открытым исходным кодом Pyright (используемого Pylance для обеспечения поддержки Python в VS Code).
Цель стандарта — предоставить библиотекам, таким как Pydantic и другим, возможность сообщать редакторам и инструментам, что они (редакторы) должны обращаться с этими библиотеками (например, Pydantic) так, как если бы они были dataclasses
, обеспечивая автодополнение, проверку типов и т. д.
Проект стандарта также включает альтернативную форму для первых пользователей, таких как Pydantic, чтобы сразу же добавить поддержку, даже до того, как новый проект стандарта будет завершен и одобрен.
Этот новый проект стандарта с альтернативной формой уже поддерживается Pyright, поэтому его можно использовать через Pylance в VS Code.
Поскольку он предлагается в качестве официального стандарта Python, другие редакторы также могут легко добавить его поддержку.
А авторы других библиотек, подобных Pydantic, также могут легко сразу принять стандарт (используя «Альтернативную форму») и получить преимущества этих дополнительных функций редактора.
本文总阅读量次