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.
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
ofstrict
(standaard staat hetoff
)
Nu krijgt u niet alleen automatische aanvulling bij het maken van nieuwe Pydantic-modelinstanties, maar ook foutcontroles voor vereiste argumenten .
En u krijgt ook foutcontroles voor ongeldige gegevenstypen .
!!! 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)
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
.
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:
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.
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.
本文总阅读量次