Types#
Modul: restalchemy.dm.types
DM-Types beschreiben zulässige Werte für Properties und wie Werte in einfache Typen (JSON, OpenAPI, Storage) konvertiert werden.
Alle Typen erben von BaseType.
BaseType#
BaseType#
Zentrale Schnittstelle für alle DM-Typen:
validate(value) -> bool: prüft, ob der Wert zulässig ist.to_simple_type(value): konvertiert einen Wert in einen einfachen Python-Typ (String, Zahl, Dict, Liste …).from_simple_type(value): konvertiert aus einem einfachen Typ zurück.from_unicode(value): parst eine String-Darstellung.to_openapi_spec(prop_kwargs): erzeugt das OpenAPI-Schema-Fragment.
Viele konkrete Typen basieren auf BasePythonType, der Python-Typen wie int oder str kapselt.
Skalare Typen#
Boolean#
- Kapselt
bool. - Akzeptiert in
from_simple_type()beliebige truthy/falsy Werte und infrom_unicode()String-Darstellungen.
String#
- Kapselt
strmit Längenbeschränkungen. - Parameter:
min_length,max_length. to_openapi_spec()ergänztminLength/maxLength.
Gängige Subklassen:
Email— validiert E-Mail-Adressen (optional mit Zustellbarkeitsprüfung).
Integer#
- Kapselt
intmitmin_valueundmax_value. Int8,Int16usw. sind spezialisierte Varianten.
Float#
- Kapselt
floatmit Grenzwerten.
Decimal#
- Kapselt
decimal.Decimalmit optionalemmax_decimal_places. - Wird als String serialisiert und deserialisiert, um Genauigkeitsverluste zu vermeiden.
UUID#
- Kapselt
uuid.UUID. - Wird als String serialisiert.
Enum#
- Schränkt Werte auf eine vorgegebene Menge ein.
Beispiel:
Verwendung in Properties:
Datums- und Zeittypen#
UTCDateTimeZ#
- Kapselt
datetime.datetimeund erzwingttzinfo == datetime.timezone.utc. - Serialisierung als String im MySQL- bzw. RFC3339-ähnlichen Format.
- Das naive
UTCDateTime, das die Zeitzone übernahm, die ein gespeicherter String nannte, wurde in 16.0.0 entfernt. Es las und schrieb dieselben zwei Formate, daher wird eine damit deklarierte Property zuUTCDateTimeZ, und gespeicherte Werte werden unverändert gelesen — als UTC, wofür sie ohnehin gehalten wurden.
TimeDelta#
- Kapselt
datetime.timedelta. - Serialisierung als Sekunden (Float).
DateTime#
- Legacy-Zeitstempeltyp, serialisiert als Unix-Timestamp.
Collection-Typen#
List und TypedList#
Listprüft, dass der Wert eine Python-Liste ist.TypedList(nested_type)stellt sicher, dass jedes Element fürnested_typegültig ist.
Beispiel:
Dict und strukturierte Dicts#
Dictprüft, dass der Wert eindictmit String-Keys ist.TypedDict(nested_type)erzwingt, dass alle Wertenested_typeentsprechen.
Schema-basierte Dicts:
SoftSchemeDict(scheme)— Dict, dessen Keys eine Teilmenge des Schemas sind.SchemeDict(scheme)— Dict, das dem Schema exakt entsprechen muss.
Beispiel:
from restalchemy.dm import types
settings_scheme = {
"retries": types.Integer(min_value=0),
"timeout": types.Float(min_value=0.0),
}
settings_type = types.SoftSchemeDict(settings_scheme)
Verwendung in einer Property:
Nullable und Wrapper#
AllowNone(nested_type)#
- Erlaubt
Noneoder einen gültigen Wert fürnested_type. to_simple_type()undfrom_simple_type()reichen annested_typedurch, sofern der Wert nichtNoneist.to_openapi_spec()fügtnullable: truehinzu.
Beispiel:
Regexp- und URL-Typen#
BaseRegExpType und BaseCompiledRegExpTypeFromAttr#
Low-Level-Basisklassen für regexp-basierte Typen.
Konkrete Typen:
Uri— validiert URI-Pfade, die auf eine UUID enden.Mac— validiert MAC-Adressen.Hostname(deprecated) — siehetypes_network.Url— Validator für HTTP/FTP-URLs.
Diese Typen sind für Netzwerk- und Ressourcenbezeichner nützlich.
Dynamische und Netzwerk-Typen#
Weitere spezialisierte Typen liegen in:
restalchemy.dm.types_dynamicrestalchemy.dm.types_network
Beispiele dafür sind:
- Fortgeschrittene Hostnames, IP-Netzwerke, CIDR-Bereiche.
- Dynamische Strukturen mit zur Laufzeit definierten Schemata.
Diese Referenz listet sie nicht vollständig auf, das Verwendungsmuster ist aber immer dasselbe:
- Typ instanziieren.
- In
properties.property()verwenden. - DM übernimmt Validierung und Konvertierung.
Best Practices#
- Bevorzugen Sie DM-Types (
types.String,types.Integerusw.) gegenüber rohen Python-Typen; sie kodieren Validierung und OpenAPI-Metadaten. - Nutzen Sie
AllowNone, stattNonevon Hand in der Geschäftslogik zuzulassen. - Verwenden Sie
Enumbei kleinen, abgeschlossenen Wertemengen. - Für komplexe JSON-artige Strukturen verwenden Sie
SoftSchemeDict,SchemeDictoderTypedDictstatt eines nacktenDict.