Técnicas de validación
Métodos de validación integrados
Verificación de tipo con isinstance()
def process_data(value):
if not isinstance(value, (int, float, str)):
raise TypeError("Invalid input type")
return value
Uso de declaraciones assert
def divide_numbers(a, b):
assert b!= 0, "Division by zero is not allowed"
return a / b
Técnicas de validación avanzadas
Validación basada en decoradores
def validate_type(*types):
def decorator(func):
def wrapper(*args, **kwargs):
for arg, expected_type in zip(args, types):
if not isinstance(arg, expected_type):
raise TypeError(f"Expected {expected_type}, got {type(arg)}")
return func(*args, **kwargs)
return wrapper
return decorator
@validate_type(int, int)
def add_numbers(a, b):
return a + b
Comparación de estrategias de validación
| Técnica |
Ventajas |
Desventajas |
| isinstance() |
Simple, integrado |
Validación compleja limitada |
| Assert |
Comprobaciones rápidas |
Puede ser deshabilitado |
| Decoradores |
Reutilizable, flexible |
Ligero sobrecoste de rendimiento |
Flujo de validación compleja
graph TD
A[Input Parameters] --> B{Type Validation}
B -->|Pass| C{Range Validation}
B -->|Fail| D[Raise TypeError]
C -->|Pass| E{Custom Validation}
C -->|Fail| F[Raise ValueError]
E -->|Pass| G[Execute Function]
E -->|Fail| H[Raise Custom Exception]
Bibliotecas de validación externas
Uso de bibliotecas de terceros
- Pydantic
- Marshmallow
- Cerberus
from pydantic import BaseModel, validator
class User(BaseModel):
name: str
age: int
@validator('age')
def validate_age(cls, v):
if v < 0 or v > 120:
raise ValueError('Invalid age')
return v
Mejores prácticas
- Elija el método de validación según la complejidad
- Mantenga la lógica de validación limpia y centrada
- Utilice pistas de tipo para mayor claridad
En LabEx, recomendamos combinar múltiples técnicas de validación para un manejo de entradas robusto.
Consideraciones de rendimiento
- Minimice el sobrecoste de validación
- Utilice validación perezosa cuando sea posible
- Considere la validación compilada para el código crítico en rendimiento