Zum Inhalt

Visual Studio Code

Pydantic funktioniert sofort gut mit jedem Editor oder jeder IDE, da es auf Standardanmerkungen vom Typ Python basiert.

Bei der Verwendung von Visual Studio Code (VS Code) werden einige zusätzliche Editorfunktionen unterstützt, vergleichbar mit denen des PyCharm-Plugins .

Dies bedeutet, dass Sie auch beim Erstellen neuer Pydantic-Modellinstanzen über eine automatische Vervollständigung (oder „IntelliSense“) und Fehlerprüfungen für Typen und erforderliche Argumente verfügen.

pydantic autocompletion in VS Code

Konfigurieren Sie VS-Code

Um diese Funktionen nutzen zu können, müssen Sie sicherstellen, dass Sie VS Code korrekt konfigurieren und die empfohlenen Einstellungen verwenden.

Falls Sie eine andere Konfiguration haben, finden Sie hier eine kurze Übersicht über die Schritte.

Installieren Sie Pylance

Sie sollten die Pylance- Erweiterung für VS Code verwenden. Es handelt sich um das empfohlene offizielle VS-Code-Plug-in der nächsten Generation für Python.

Pylance wird standardmäßig als Teil der Python-Erweiterung für VS Code installiert, daher sollte es wahrscheinlich einfach funktionieren. Andernfalls können Sie überprüfen, ob es in Ihrem Editor installiert und aktiviert ist.

Konfigurieren Sie Ihre Umgebung

Dann müssen Sie sicherstellen, dass Ihr Redakteur die Python-Umgebung (wahrscheinlich eine virtuelle Umgebung) für Ihr Python-Projekt kennt.

Dies wäre die Umgebung, in der Sie Pydantic installiert haben.

Konfigurieren Sie Pylance

Mit den Standardkonfigurationen erhalten Sie Unterstützung für die automatische Vervollständigung, Pylance prüft jedoch möglicherweise nicht auf Typfehler.

Mit den folgenden Schritten können Sie Typfehlerprüfungen von Pylance aktivieren:

  • Öffnen Sie die „Benutzereinstellungen“
  • Suchen Sie nach Type Checking Mode
  • Unten finden Sie eine Option Python › Analysis: Type Checking Mode
  • Stellen Sie es auf basic oder strict ein (standardmäßig ist es off ).

Type Checking Mode set to strict in VS Code

Jetzt erhalten Sie beim Erstellen neuer Pydantic-Modellinstanzen nicht nur eine automatische Vervollständigung, sondern auch Fehlerprüfungen für erforderliche Argumente .

Required arguments error checks in VS Code

Außerdem erhalten Sie Fehlerprüfungen für ungültige Datentypen .

Invalid data types error checks in VS Code

!!! Hinweis „Technische Details“ Pylance ist die VS-Code-Erweiterung, es ist Closed Source, kann aber kostenlos verwendet werden. Darunter verwendet Pylance ein Open-Source-Tool (ebenfalls von Microsoft) namens Pyright , das die ganze schwere Arbeit übernimmt.

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).

Konfigurieren Sie mypy

Möglicherweise möchten Sie mypy auch in VS Code konfigurieren, um mypy-Fehlerprüfungen inline in Ihrem Editor zu erhalten (alternativ/zusätzlich zu Pylance).

Hierzu zählen auch die vom Pydantic Mypy-Plugin erkannten Fehler, wenn Sie es konfiguriert haben.

Gehen Sie wie folgt vor, um mypy in VS Code zu aktivieren:

  • Öffnen Sie die „Benutzereinstellungen“
  • Suchen Sie nach Mypy Enabled
  • Unten finden Sie eine Option Python › Linting: Mypy Enabled
  • Aktivieren Sie das Kontrollkästchen (standardmäßig ist es deaktiviert).

mypy enabled in VS Code

Tipps und Tricks

Hier finden Sie einige zusätzliche Tipps und Tricks, um Ihr Entwicklererlebnis bei der Verwendung von VS Code mit Pydantic zu verbessern.

Strenge Fehler

Diese zusätzliche Editor-Unterstützung funktioniert so, dass Pylance Ihre Pydantic-Modelle so behandelt, als wären sie reine Python- dataclasses .

Außerdem werden beim Erstellen einer neuen Pydantic-Modellinstanz strenge Typfehlerprüfungen für die in Argumenten übergebenen Datentypen angezeigt.

In diesem Beispiel können Sie sehen, dass ein str von '23' kein gültiger int für das Argument age ist.

VS Code strict type errors

Es würde age=23 anstelle von age='23' erwarten.

Dennoch besteht das Design und eines der Hauptmerkmale von Pydantic darin, dass es sehr nachsichtig mit Datentypen umgeht .

Es akzeptiert tatsächlich den str mit dem Wert '23' und wandelt ihn in einen int mit dem Wert 23 um.

Diese strengen Fehlerprüfungen sind in den meisten Fällen sehr nützlich und können Ihnen dabei helfen , viele Fehler frühzeitig zu erkennen . Aber es gibt Fälle, wie etwa bei age='23' , in denen es unangenehm sein könnte, einen „falsch positiven“ Fehler zu melden.


Dieses Beispiel oben mit age='23' ist absichtlich einfach gehalten, um den Fehler und die Unterschiede in den Typen zu verdeutlichen.

Aber häufigere Fälle, in denen diese strengen Fehler unpraktisch wären, wären die Verwendung anspruchsvollerer Datentypen, wie etwa int Werte für datetime Uhrzeitfelder oder dict -Werte für Pydantic-Untermodelle.

Dies gilt beispielsweise für 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}
)

Der Typ des knight wird mit der Klasse Knight (einem Pydantic-Modell) deklariert und der Code übergibt stattdessen ein wörtliches dict . Dies gilt weiterhin für Pydantic und das dict würde automatisch in eine Knight -Instanz umgewandelt.

Dennoch würde es als Typfehler erkannt werden:

VS Code strict type errors with model

In diesen Fällen gibt es mehrere Möglichkeiten, strikte Fehler an ganz bestimmten Stellen zu deaktivieren oder zu ignorieren, sie aber dennoch im Rest des Codes beizubehalten.

Im Folgenden finden Sie verschiedene Techniken, um dies zu erreichen.

Typprüfungen in einer Zeile deaktivieren

Sie können die Fehler für eine bestimmte Zeile mit einem Kommentar deaktivieren:

# type: ignore

oder (um spezifisch auf pylance/pyright zu sein):

# pyright: ignore

( Pyright ist der von Pylance verwendete Sprachserver.)

Wenn wir auf das Beispiel mit age='23' zurückkommen, wäre es:

from pydantic import BaseModel


class Knight(BaseModel):
    title: str
    age: int
    color: str = 'blue'


lancelot = Knight(title='Sir Lancelot', age='23')  # pyright: ignore

Auf diese Weise ignorieren Pylance und Mypy Fehler in dieser Zeile.

Vorteile : Es ist eine einfache Änderung in dieser Zeile, um dort Fehler zu beseitigen.

Nachteile : Alle anderen Fehler in dieser Zeile werden ebenfalls weggelassen, einschließlich Typprüfungen, falsch geschriebene Argumente, nicht angegebene erforderliche Argumente usw.

Überschreiben Sie den Typ einer Variablen

Sie können auch eine Variable mit dem Wert erstellen, den Sie verwenden möchten, und ihren Typ explizit mit Any deklarieren.

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)

Auf diese Weise interpretieren Pylance und mypy die Variable age_str so, als ob sie ihren Typ nicht kennen würden, anstatt zu wissen, dass sie einen Typ str hat, wenn ein int erwartet wurde (und dann den entsprechenden Fehler anzuzeigen).

Vorteile : Fehler werden nur für einen bestimmten Wert ignoriert und Sie sehen weiterhin alle zusätzlichen Fehler für die anderen Argumente.

Nachteile : Für jedes Argument, das Fehler ignorieren muss, muss Any und eine neue Variable in einer neuen Zeile importiert werden.

Überschreiben Sie den Typ eines Werts mit cast

Die gleiche Idee aus dem vorherigen Beispiel kann mit Hilfe von cast() in die gleiche Zeile gebracht werden.

Auf diese Weise wird die Typdeklaration des Werts inline überschrieben, ohne dass eine weitere Variable erforderlich ist.

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') hat keinen Einfluss auf den Wert, er ist immer noch nur '23' , aber jetzt gehen Pylance und mypy davon aus, dass es sich um den Typ Any handelt, was bedeutet, dass sie so tun, als ob sie den Typ nicht kennen würden des Wertes.

Dies ist also das Äquivalent zum vorherigen Beispiel, ohne die zusätzliche Variable.

Vorteile : Fehler werden nur für einen bestimmten Wert ignoriert und Sie sehen weiterhin alle zusätzlichen Fehler für die anderen Argumente. Es sind keine zusätzlichen Variablen erforderlich.

Nachteile : Es erfordert den Import von Any und cast , und wenn Sie nicht daran gewöhnt sind, cast() zu verwenden, könnte es zunächst seltsam erscheinen.

Config in Klassenargumenten

Pydantic verfügt über einen umfangreichen Satz an Modellkonfigurationen.

Diese Konfigurationen können in einer internen class Config für jedes Modell festgelegt werden:

from pydantic import BaseModel


class Knight(BaseModel):
    model_config = dict(frozen=True)
    title: str
    age: int
    color: str = 'blue'

oder als Schlüsselwortargumente beim Definieren der Modellklasse übergeben:

from pydantic import BaseModel


class Knight(BaseModel, frozen=True):
    title: str
    age: int
    color: str = 'blue'

Die spezifische frozen Konfiguration (in der Betaversion) hat eine besondere Bedeutung.

Dadurch wird verhindert, dass anderer Code eine Modellinstanz nach der Erstellung ändert, sodass sie „eingefroren“ bleibt.

Wenn Sie die zweite Version verwenden, um frozen=True zu deklarieren (mit Schlüsselwortargumenten in der Klassendefinition), kann Pylance sie verwenden, um Ihnen beim Einchecken Ihres Codes zu helfen und Fehler zu erkennen, wenn etwas versucht, Werte in einem Modell festzulegen, das „eingefroren“ ist.

VS Code strict type errors with model

Mit Field einen Standard hinzufügen

Pylance/pyright erfordert, dass default ein Schlüsselwortargument für Field ist, um daraus schließen zu können, dass das Feld optional ist.

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"

Dies ist eine Einschränkung von Datenklassentransformationen und kann in Pydantic nicht behoben werden.

Technische Details

!!! Warnung Als Pydantic-Benutzer benötigen Sie die folgenden Details nicht. Sie können den Rest dieses Abschnitts gerne überspringen.

These details are only useful for other library authors, etc.

Diese zusätzliche Editorunterstützung funktioniert durch die Implementierung des vorgeschlagenen Standardentwurfs für Dataclass Transform (PEP 681) .

Der vorgeschlagene Standardentwurf wurde von Eric Traut vom Microsoft-Team geschrieben, dem gleichen Autor des Open-Source-Pakets Pyright (das von Pylance zur Bereitstellung von Python-Unterstützung in VS Code verwendet wird).

Ziel des Standards ist es, Bibliotheken wie Pydantic und anderen eine Möglichkeit zu bieten, Editoren und Tools mitzuteilen, dass sie (die Editoren) diese Bibliotheken (z. B. Pydantic) so behandeln sollen, als wären sie dataclasses , die automatische Vervollständigung, Typprüfungen usw. bereitstellen.

Der Standardentwurf enthält auch ein alternatives Formular für Early Adopters wie Pydantic, um sofort Unterstützung hinzuzufügen, noch bevor der neue Standardentwurf fertiggestellt und genehmigt ist.

Dieser neue Standardentwurf mit der alternativen Form wird bereits von Pyright unterstützt, sodass er über Pylance in VS Code verwendet werden kann.

Da es als offizieller Standard für Python vorgeschlagen wird, können auch andere Editoren problemlos Unterstützung dafür hinzufügen.

Und auch Autoren anderer Pydantic-ähnlicher Bibliotheken können den Standard problemlos sofort übernehmen (mithilfe der „Alternate Form“) und die Vorteile dieser zusätzlichen Editorfunktionen nutzen.


本文总阅读量