Wie kann man bei der Typprüfung dafür sorgen, dass ein pydantisches Modellattribut mehrere Eingabetypen für eine benutzePython

Python-Programme
Guest
 Wie kann man bei der Typprüfung dafür sorgen, dass ein pydantisches Modellattribut mehrere Eingabetypen für eine benutze

Post by Guest »

Ich verwende die Pydantic-Bibliothek, Version 2.
Ich habe eine benutzerdefinierte Klasse erstellt, die int unterordnet und eine __get_pydantic_core_schema__-Methode implementiert.
Wenn ich diese benutzerdefinierte Klasse in einem Pydantic-Modell verwende, möchte ich, dass der Typprüfer (Basedpyright) erkennt, dass das Attribut des instanziierten Modells vom Typ meiner benutzerdefinierten Klasse ist funktioniert, aber ich kann das Modell auch mit einem str oder einem int instanziieren.
Ich möchte jedoch keine Überladungen definieren oder die __init__ überschreiben. -Methode für jedes Modell, das meine benutzerdefinierte Klasse verwendet, da sie den Zweck zunichte macht und den Code sehr ausführlich macht, insbesondere wenn ich alle Attribute bei jeder __init__-Überladung/Überschreibung neu definieren muss.Hier ist ein minimal reproduzierbares Beispiel:

Code: Select all

from typing import Any, reveal_type
from pydantic_core import CoreSchema, core_schema
from pydantic import GetCoreSchemaHandler, BaseModel

class MyCustomInt(int):
@classmethod
def __get_pydantic_core_schema__(
cls,
_source_type: Any,
_handler: GetCoreSchemaHandler,
) -> CoreSchema:
def validate_from_int(value: int) -> "MyCustomInt":
if value < 0:
raise ValueError("Cannot be negative")
return cls(value)

from_int_schema = core_schema.chain_schema(
[
core_schema.int_schema(),
core_schema.no_info_plain_validator_function(validate_from_int),
]
)

return core_schema.json_or_python_schema(
json_schema=from_int_schema,
python_schema=core_schema.union_schema(
[
core_schema.is_instance_schema(cls),
from_int_schema,
]
),
serialization=core_schema.plain_serializer_function_ser_schema(
str,
return_schema=core_schema.str_schema(),
when_used='json'
),
)

class MyModel(BaseModel):
value: MyCustomInt

model = MyModel(value="123")  # Error: Argument of type "str" cannot be assigned to parameter "value" of type "MyCustomInt" in function "__init__"
reveal_type(model.value)  # Revealed type is 'MyCustomInt' - Good!
model = MyModel(value=123)  # Error: Argument of type "int" cannot be assigned to parameter "value" of type "MyCustomInt" in function "__init__"
reveal_type(model.value)  # Revealed type is 'MyCustomInt' - Good!
Um es klarzustellen: Dies funktioniert zur Laufzeit einwandfrei und es handelt sich lediglich um ein Problem der Typprüfung.
Gibt es eine Möglichkeit, das zu informieren Typprüfer über die akzeptablen Validierungstypen für MyCustomInt, ohne __init__ in jedem Modell überladen oder überschreiben zu müssen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post