Meilleures pratiques
Principes de conception de la validation
Messages d'erreur clairs
def validate_email(email):
if not email or '@' not in email:
raise ValueError(f"Format d'email invalide : {email}")
Stratégie de « fail fast »
def process_user_data(user_data):
if not user_data:
raise ValueError("Données utilisateur vides")
## Validez chaque champ critique immédiatement
validate_username(user_data.get('username'))
validate_email(user_data.get('email'))
Approches de validation
Indication de type avec validation
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("Tous les éléments doivent être des entiers")
if limit is not None and len(numbers) > limit:
raise ValueError(f"La liste dépasse la longueur maximale de {limit}")
Comparaison des stratégies de validation
Stratégie |
Complexité |
Performance |
Flexibilité |
Vérifications intégrées |
Basse |
Haute |
Limitée |
Basées sur les décorateurs |
Moyenne |
Moyenne |
Haute |
Modèles Pydantic |
Haute |
Basse |
Très haute |
Flux de validation
graph TD
A[Données d'entrée] --> B{Vérification de type de base}
B -->|Valide| C{Validation de plage}
B -->|Non valide| D[Lancer une erreur de type]
C -->|Valide| E{Validation personnalisée}
C -->|Non valide| F[Lancer une erreur de valeur]
E -->|Valide| G[Traiter les données]
E -->|Non valide| H[Lancer une erreur personnalisée]
Techniques de validation avancées
Validation conditionnelle
def register_user(username, age, email=None):
if not username:
raise ValueError("Le nom d'utilisateur est requis")
if age < 18 et email is None:
raise ValueError("L'email est requis pour les utilisateurs de moins de 18 ans")
Validation paresseuse
class LazyValidator:
def __init__(self, data):
self._data = data
self._validated = False
def validate(self):
if not self._validated:
## Effectuez la validation seulement si nécessaire
self._check_data()
self._validated = True
return self._data
Stratégies de gestion d'erreurs
Gestion d'exceptions personnalisées
class ValidationError(Exception):
def __init__(self, message, field=None):
self.message = message
self.field = field
super().__init__(self.message)
def validate_config(config):
try:
## Logique de validation
pass
except ValidationError as e:
print(f"La validation a échoué pour {e.field} : {e.message}")
Recommandations clés
Au LabEx, nous recommandons :
- Utiliser des indications de type
- Créer des messages d'erreur clairs et spécifiques
- Implémenter la validation le plus tôt possible
- Trouver un équilibre entre une vérification approfondie et la performance
Pièges courants à éviter
- Logique de validation trop complexe
- Ignorer les cas limites
- Gestion d'erreurs incohérente
- Goulots d'étranglement de performance