Best Practices
Validierungsdesignprinzipien
Klarheit der Fehlermeldungen
def validate_email(email):
if not email or '@' not in email:
raise ValueError(f"Ungültiges E-Mail-Format: {email}")
Fail-Fast-Strategie
def process_user_data(user_data):
if not user_data:
raise ValueError("Leere Benutzerdaten")
## Überprüfe jedes kritische Feld sofort
validate_username(user_data.get('username'))
validate_email(user_data.get('email'))
Validierungsansätze
Typhinweise mit Validierung
from typing import List, Optional
def process_numbers(numbers: List[int], limit: Optional[int] = None):
if not all(isinstance(n, int) for n in numbers):
raise TypeError("Alle Elemente müssen ganze Zahlen sein")
if limit is not None and len(numbers) > limit:
raise ValueError(f"Liste überschreitet maximale Länge von {limit}")
Vergleich von Validierungsstrategien
Strategie |
Komplexität |
Leistung |
Flexibilität |
Einbautprüfungen |
Niedrig |
Hoch |
Begrenzt |
Dekorator-basiert |
Mittel |
Mittel |
Hoch |
Pydantic-Modelle |
Hoch |
Niedrig |
Sehr hoch |
Validierungsworkflow
graph TD
A[Eingabedaten] --> B{Grundlegende Typüberprüfung}
B -->|Bestanden| C{Bereichsvalidierung}
B -->|Nicht bestanden| D[Wirf Typfehler]
C -->|Bestanden| E{Benutzerdefinierte Validierung}
C -->|Nicht bestanden| F[Wirf Wertfehler]
E -->|Bestanden| G[Daten verarbeiten]
E -->|Nicht bestanden| H[Wirf benutzerdefinierte Fehlermeldung]
Fortgeschrittene Validierungstechniken
Bedingte Validierung
def register_user(username, age, email=None):
if not username:
raise ValueError("Benutzername erforderlich")
if age < 18 und email is None:
raise ValueError("E-Mail erforderlich für Benutzer unter 18 Jahren")
Leistungsoptimierung
Trägere Validierung
class LazyValidator:
def __init__(self, data):
self._data = data
self._validated = False
def validate(self):
if not self._validated:
## Führe die Validierung nur wenn erforderlich durch
self._check_data()
self._validated = True
return self._data
Fehlerbehandlungsstrategien
Benutzerdefinierte Ausnahmebehandlung
class ValidationError(Exception):
def __init__(self, message, field=None):
self.message = message
self.field = field
super().__init__(self.message)
def validate_config(config):
try:
## Validierungslogik
pass
except ValidationError as e:
print(f"Validierung fehlgeschlagen für {e.field}: {e.message}")
Wichtige Empfehlungen
Bei LabEx empfehlen wir:
- Verwenden Sie Typhinweise
- Erstellen Sie klare, spezifische Fehlermeldungen
- Implementieren Sie die Validierung so früh wie möglich
- Finden Sie ein Gleichgewicht zwischen umfassender Prüfung und Leistung
Gemeinsame Fallstricke, die zu vermeiden sind
- Überkomplizierte Validierungslogik
- Ignorieren von Randfällen
- Inkonsistente Fehlerbehandlung
- Leistungsengpässe