Data Validation Patterns
graph TD
A[Input Data] --> B{Type Check}
B --> |Valid Type| C{Range Check}
B --> |Invalid Type| D[Reject Input]
C --> |Within Range| E{Format Check}
C --> |Out of Range| F[Reject Input]
E --> |Valid Format| G[Process Data]
E --> |Invalid Format| H[Reject Input]
Regular Expression Validation
import re
def validate_numeric_input(value, min_val=None, max_val=None, decimal_places=None):
## Pattern for numeric validation
numeric_pattern = r'^-?\d+(?:\.\d+)?$'
## Check if input matches numeric pattern
if not re.match(numeric_pattern, str(value)):
return False
try:
## Convert to float for further validation
numeric_value = float(value)
## Range validation
if min_val is not None and numeric_value < min_val:
return False
if max_val is not None and numeric_value > max_val:
return False
## Decimal places validation
if decimal_places is not None:
decimal_part = str(value).split('.')
if len(decimal_part) > 1 and len(decimal_part[1]) > decimal_places:
return False
return True
except ValueError:
return False
## Validation Examples
print(validate_numeric_input(123)) ## True
print(validate_numeric_input(3.14159, decimal_places=2)) ## False
print(validate_numeric_input(50, min_val=0, max_val=100)) ## True
Advanced Validation Techniques
Decorator-Based Validation
def numeric_validator(min_val=None, max_val=None):
def decorator(func):
def wrapper(*args, **kwargs):
## Validate numeric arguments
for arg in args:
if not isinstance(arg, (int, float)):
raise ValueError(f"Invalid numeric input: {arg}")
if min_val is not None and arg < min_val:
raise ValueError(f"Value {arg} below minimum {min_val}")
if max_val is not None and arg > max_val:
raise ValueError(f"Value {arg} above maximum {max_val}")
return func(*args, **kwargs)
return wrapper
return decorator
## Usage example
@numeric_validator(min_val=0, max_val=100)
def calculate_percentage(score):
return (score / 100) * 100
print(calculate_percentage(75)) ## Works fine
## print(calculate_percentage(150)) ## Raises ValueError
Validation Patterns Comparison
| Validation Type |
Method |
Complexity |
Use Case |
| Type Checking |
isinstance() |
Low |
Basic type verification |
| Regex Validation |
Regular Expressions |
Medium |
Complex format checking |
| Decorator Validation |
Function Wrappers |
High |
Comprehensive input validation |
Error Handling Strategies
def safe_numeric_conversion(value, default=None):
try:
return float(value)
except (ValueError, TypeError):
return default
## Safe conversion examples
print(safe_numeric_conversion("123")) ## 123.0
print(safe_numeric_conversion("abc", 0)) ## 0
LabEx Best Practices
At LabEx, we recommend implementing multi-layered validation techniques to ensure robust and secure numeric input processing.
Key Takeaways
- Use multiple validation layers
- Implement flexible error handling
- Leverage Python's type checking capabilities
- Create reusable validation functions