Ga naar inhoud

Visual Studio Code

Pydantic werkt kant-en-klaar goed met elke editor of IDE, omdat het bovenop standaard annotaties van het Python-type is gemaakt.

Wanneer u Visual Studio Code (VS Code) gebruikt, worden er enkele extra editorfuncties ondersteund, vergelijkbaar met die van de PyCharm-plug-in .

Dit betekent dat u automatische aanvulling (of "IntelliSense") en foutcontroles voor typen en vereiste argumenten zult hebben, zelfs tijdens het maken van nieuwe Pydantic-modelinstanties.

pydantic autocompletion in VS Code

Configureer VS-code

Om van deze functies te profiteren, moet u ervoor zorgen dat u VS Code correct configureert, met behulp van de aanbevolen instellingen.

Indien u een andere configuratie heeft, vindt u hier een kort overzicht van de stappen.

Installeer Pylance

U moet de Pylance- extensie voor VS Code gebruiken. Het is de aanbevolen, officiële VS Code-plug-in van de volgende generatie voor Python.

Pylance wordt standaard geïnstalleerd als onderdeel van de Python Extension for VS Code , dus het zou waarschijnlijk gewoon moeten werken. Anders kunt u controleren of het in uw editor is geïnstalleerd en ingeschakeld.

Configureer uw omgeving

Dan moet je ervoor zorgen dat je editor de Python-omgeving (waarschijnlijk een virtuele omgeving) voor je Python-project kent.

Dit zou de omgeving zijn waarin u Pydantic hebt geïnstalleerd.

Configureer Pylance

Met de standaardconfiguraties krijgt u ondersteuning voor automatisch aanvullen, maar Pylance controleert mogelijk niet op typefouten.

Met de volgende stappen kunt u typefoutcontroles vanuit Pylance inschakelen:

  • Open de "Gebruikersinstellingen"
  • Zoek naar Type Checking Mode
  • Onder vind je een optie Python › Analysis: Type Checking Mode
  • Stel het in op basic of strict (standaard staat het off )

Type Checking Mode set to strict in VS Code

Nu krijgt u niet alleen automatische aanvulling bij het maken van nieuwe Pydantic-modelinstanties, maar ook foutcontroles voor vereiste argumenten .

Required arguments error checks in VS Code

En u krijgt ook foutcontroles voor ongeldige gegevenstypen .

Invalid data types error checks in VS Code

!!! opmerking "Technische details" Pylance is de VS Code-extensie, het is een gesloten bron, maar gratis te gebruiken. Hieronder gebruikt Pylance een open source tool (ook van Microsoft) genaamd Pyright die al het zware werk doet.

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

Configureer mypy

Mogelijk wilt u mypy ook configureren in VS Code om mypy-foutcontroles inline te krijgen in uw editor (alternatief/aanvullend op Pylance).

Dit omvat de fouten die zijn gedetecteerd door de Pydantic mypy-plug-in , als u deze hebt geconfigureerd.

Om mypy in VS Code in te schakelen, doet u het volgende:

  • Open de "Gebruikersinstellingen"
  • Zoek naar Mypy Enabled
  • Onder vind je een optie Python › Linting: Mypy Enabled
  • Vink het vakje aan (standaard is dit uitgeschakeld)

mypy enabled in VS Code

Tips en trucs

Hier zijn enkele aanvullende tips en trucs om uw ontwikkelaarservaring te verbeteren bij het gebruik van VS Code met Pydantic.

Strikte fouten

De manier waarop deze extra editorondersteuning werkt, is dat Pylance uw Pydantic-modellen zal behandelen alsof het pure dataclasses van Python zijn.

En het zal strikte typefoutcontroles tonen over de gegevenstypen die in argumenten worden doorgegeven bij het maken van een nieuwe Pydantic-modelinstantie.

In dit voorbeeld kun je zien dat het laat zien dat een str van '23' geen geldige int is voor het argument age .

VS Code strict type errors

Er wordt verwacht age=23 in plaats van age='23' .

Niettemin is het ontwerp, en een van de belangrijkste kenmerken van Pydantic, dat het zeer soepel omgaat met gegevenstypen .

Het accepteert feitelijk de str met waarde '23' en converteert deze naar een int met waarde 23 .

Deze strikte foutcontroles zijn meestal erg nuttig en kunnen u helpen veel bugs vroegtijdig op te sporen . Maar er zijn gevallen, zoals bij age='23' , waarin ze lastig kunnen zijn door een "vals-positieve" fout te rapporteren.


Dit voorbeeld hierboven met age='23' is opzettelijk eenvoudig gehouden om de fout en de verschillen in typen te laten zien.

Maar vaker voorkomende gevallen waarin deze strikte fouten lastig zouden zijn, zijn bij het gebruik van meer geavanceerde gegevenstypen, zoals int waarden voor datetime -velden, of dict waarden voor Pydantic-submodellen.

Dit geldt bijvoorbeeld voor 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}
)

Het type knight wordt aangegeven met de klasse Knight (een Pydantic-model) en de code geeft in plaats daarvan een letterlijk dict door. Dit geldt nog steeds voor Pydantic en het dict zou automatisch worden omgezet naar een Knight -instantie.

Niettemin zou het als een typefout worden gedetecteerd:

VS Code strict type errors with model

In die gevallen zijn er verschillende manieren om strikte fouten op zeer specifieke plaatsen uit te schakelen of te negeren, terwijl ze toch in de rest van de code behouden blijven.

Hieronder staan verschillende technieken om dit te bereiken.

Schakel typecontroles op een regel uit

U kunt de fouten voor een specifieke regel uitschakelen met behulp van een opmerking van:

# type: ignore

of (om specifiek te zijn voor pylance/pyright):

# pyright: ignore

( pyright is de taalserver die door Pylance wordt gebruikt.).

Als we terugkomen op het voorbeeld met age='23' , zou het zijn:

from pydantic import BaseModel


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


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

op die manier zullen Pylance en mypy fouten in die regel negeren.

Voordelen : het is een simpele wijziging in die regel om fouten daar te verwijderen.

Nadelen : elke andere fout in die regel wordt ook weggelaten, inclusief typecontroles, verkeerd gespelde argumenten, vereiste argumenten die niet zijn opgegeven, enz.

Overschrijf het type van een variabele

U kunt ook een variabele maken met de waarde die u wilt gebruiken en het type ervan expliciet declareren met 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)

op die manier zullen Pylance en mypy de variabele age_str interpreteren alsof ze het type niet kennen, in plaats van te weten dat het een type str heeft wanneer een int werd verwacht (en vervolgens de bijbehorende fout weer te geven).

Voordelen : fouten worden alleen voor een specifieke waarde genegeerd, en eventuele aanvullende fouten voor de andere argumenten worden nog steeds weergegeven.

Nadelen : het vereist het importeren van Any en een nieuwe variabele op een nieuwe regel voor elk argument dat fouten moet negeren.

Overschrijf het type waarde met cast

Hetzelfde idee uit het vorige voorbeeld kan met behulp van cast() op dezelfde regel worden geplaatst.

Op deze manier wordt de typedeclaratie van de waarde inline overschreven, zonder dat er een andere variabele nodig is.

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') heeft geen invloed op de waarde, het is nog steeds gewoon '23' , maar nu gaan Pylance en mypy ervan uit dat het van het type Any is, wat betekent dat ze zullen doen alsof ze het type niet kennen van de waarde.

Dit is dus het equivalent van het vorige voorbeeld, zonder de extra variabele.

Voordelen : fouten worden alleen voor een specifieke waarde genegeerd, en eventuele aanvullende fouten voor de andere argumenten worden nog steeds weergegeven. Er zijn geen extra variabelen nodig.

Nadelen : het vereist het importeren van Any en cast , en als je niet gewend bent aan het gebruik van cast() , kan het in eerste instantie vreemd lijken.

Configureer in klasse-argumenten

Pydantic heeft een uitgebreide set Modelconfiguraties beschikbaar.

Deze configuraties kunnen op elk model worden ingesteld in een interne class Config :

from pydantic import BaseModel


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

of doorgegeven als trefwoordargumenten bij het definiëren van de modelklasse:

from pydantic import BaseModel


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

De specifieke frozen configuratie (in bèta) heeft een speciale betekenis.

Het voorkomt dat andere code een modelinstantie wijzigt zodra deze is gemaakt, waardoor deze "bevroren" blijft.

Wanneer u de tweede versie gebruikt om frozen=True te declareren (met trefwoordargumenten in de klassendefinitie), kan Pylance deze gebruiken om u te helpen uw code in te checken en fouten te detecteren wanneer iets waarden probeert in te stellen in een model dat "bevroren" is.

VS Code strict type errors with model

Een standaard toevoegen met Field

Pylance/pyright vereist dat default een trefwoordargument voor Field is om te kunnen concluderen dat het veld optioneel is.

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"

Dit is een beperking van dataklasse-transformaties en kan niet worden opgelost in pydantic.

Technische details

!!! waarschuwing Als Pydantic-gebruiker heeft u de onderstaande gegevens niet nodig. Voel je vrij om de rest van dit gedeelte over te slaan.

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

Deze extra editorondersteuning werkt door de voorgestelde conceptstandaard voor Dataclass Transform (PEP 681) te implementeren.

De voorgestelde conceptstandaard is geschreven door Eric Traut, van het Microsoft-team, dezelfde auteur van het open source-pakket Pyright (gebruikt door Pylance om Python-ondersteuning te bieden in VS Code).

De bedoeling van de standaard is om bibliotheken zoals Pydantic en anderen een manier te bieden om editors en tools te vertellen dat zij (de editors) deze bibliotheken (bijv. Pydantic) moeten behandelen alsof het dataclasses zijn, door automatische aanvulling, typecontroles, enz. te bieden.

De conceptstandaard bevat ook een alternatief formulier voor early adopters, zoals Pydantic, om er meteen ondersteuning voor toe te voegen, nog voordat de nieuwe conceptstandaard klaar en goedgekeurd is.

Deze nieuwe conceptstandaard, met het Alternatieve Formulier, wordt al ondersteund door Pyright en kan dus via Pylance in VS Code worden gebruikt.

Omdat het wordt voorgesteld als een officiële standaard voor Python, kunnen andere editors er ook eenvoudig ondersteuning voor toevoegen.

En auteurs van andere bibliotheken vergelijkbaar met Pydantic kunnen de standaard ook gemakkelijk meteen overnemen (met behulp van de "Alternate Form") en profiteren van de voordelen van deze extra editorfuncties.


本文总阅读量