Wie kann der Zwangsmodus von Pydantics nicht streng, für ganzzahlige Literale gelten?
Posted: 14 Feb 2025, 04:55
Ich validiere Eingaben für eine Funktion unter Verwendung von Pydantics @validate_call wie folgt:
Ich möchte, dass Pydantic seinen Standardtyp-Zwang ausführt, wie es mit dem int Typ:
Wenn ich die Annotation A: int verwende, erzwungen es, Strings wie '180' zu erzwingen, aber dann muss ich manuell validieren, welche Ganzzahlen angegeben werden. < /p>
Wie mache ich Pydantic -Typ -Zwang für Literale? Dies erfordert, dass ein < /code> ein String -Typ anstelle einer Ganzzahl ist, solange er immer noch sowohl eine Ganzzahl- als auch die String -Eingabe ermöglicht. < /em> < /p>
< H3> Schlechte Lösungen < /h3>
[*] Ich möchte nicht jeden wörtlichen Fall hinzufügen. Buchstäblich [0, 90, 180, 270, '0', '90', '180', '270'] ist schlecht, weil es die Zeichenfolgen nicht zulässt. '-0' oder ' 180.0 '. Annotiert [int, field (ge = 90, le = 90)] | ... , aber das ist dumm ausführlich. Zu diesem Zeitpunkt ist es einfacher, nur a: int zu akzeptieren und den bestimmten Wert innerhalb der Methode zu validieren.
[/u]
Code: Select all
from typing import Literal
from pydantic import validate_call
@validate_call
def foo(a: Literal[0, 90, 180, 270]) -> None:
print(a, type(a))
Code: Select all
foo(90) # Works as expected
foo('90') # Doesn't work, but I want it to
Wie mache ich Pydantic -Typ -Zwang für Literale? Dies erfordert, dass ein < /code> ein String -Typ anstelle einer Ganzzahl ist, solange er immer noch sowohl eine Ganzzahl- als auch die String -Eingabe ermöglicht. < /em> < /p>
< H3> Schlechte Lösungen < /h3>
[*] Ich möchte nicht jeden wörtlichen Fall hinzufügen. Buchstäblich [0, 90, 180, 270, '0', '90', '180', '270'] ist schlecht, weil es die Zeichenfolgen nicht zulässt. '-0' oder ' 180.0 '. Annotiert [int, field (ge = 90, le = 90)] | ... , aber das ist dumm ausführlich. Zu diesem Zeitpunkt ist es einfacher, nur a: int zu akzeptieren und den bestimmten Wert innerhalb der Methode zu validieren.
[/u]