import functools
import inspect
def validate_url_params(func):
"""
Decorator to validate URL parameters and wrap errors for diagnostics.
"""
@functools.wraps(func)
def wrapper(*args, **kwargs):
"""Wrapper function to validate URL parameters."""
sig = inspect.signature(func)
params = sig.parameters
# Extract URL parameters from kwargs
url_params = {
p.name: kwargs.get(p.name)
for p in params.values()
if p.name in kwargs
}
# Validate parameters based on function signature
for name, param in params.items():
if param.default is inspect.Parameter.empty and name in url_params:
try:
# Perform validation logic here. Example: convert to int
if param.annotation == int:
int(url_params[name])
# Add other validation logic based on param.annotation
# ...
except ValueError:
raise ValueError(f"Invalid value for URL parameter '{name}'. Expected {param.annotation}, got '{url_params[name]}'")
except TypeError:
raise TypeError(f"Invalid type for URL parameter '{name}'. Expected {param.annotation}, got {type(url_params[name])}")
# Call the original function if validation passes
return func(*args, **kwargs)
return wrapper
if __name__ == '__main__':
@validate_url_params
def my_function(id: int, name: str = "default"):
"""
Example function that accepts URL parameters.
"""
print(f"ID: {id}, Name: {name}")
# Test cases
try:
my_function(123, name="Alice") # Valid
my_function(123) # Valid, uses default for name
my_function("abc", name="Bob") # Raises ValueError
except (ValueError, TypeError) as e:
print(f"Error: {e}")
Add your comment