Type Validators
Type validators provide functionalities for validating specific data types and values within predefined sets.
is_dict
Validates that the field is a dictionary.
from pyvalidx import ValidatedModel, field_validated
from pyvalidx.types import is_dict
class ConfigModel(ValidatedModel):
settings: dict = field_validated(is_dict())
metadata: dict = field_validated(is_dict('Metadata must be a dictionary'))
# Valid usage
config = ConfigModel(
settings={'debug': True, 'port': 8080},
metadata={'version': '1.0', 'author': 'John Doe'}
)
# Invalid usage
try:
invalid_config = ConfigModel(settings='not a dict')
except ValidationException as e:
print(e.validations) # {'settings': 'Must be a dictionary'}
Parameters
message
(str, optional): Custom error message. Default: 'Must be a dictionary'
is_list
Validates that the field is a list.
from pyvalidx.types import is_list
class PlaylistModel(ValidatedModel):
songs: list = field_validated(is_list())
genres: list = field_validated(is_list('Genres must be a list'))
# Valid usage
playlist = PlaylistModel(
songs=['Song 1', 'Song 2', 'Song 3'],
genres=['Rock', 'Pop', 'Jazz']
)
# Invalid usage
try:
invalid_playlist = PlaylistModel(songs='not a list')
except ValidationException as e:
print(e.validations) # {'songs': 'Must be a list'}
Parameters
message
(str, optional): Custom error message. Default: 'Must be a list'
is_boolean
Validates that the field is a boolean.
from pyvalidx.types import is_boolean
class SettingsModel(ValidatedModel):
enabled: bool = field_validated(is_boolean())
debug_mode: bool = field_validated(is_boolean('Debug mode must be true or false'))
# Valid usage
settings = SettingsModel(
enabled=True,
debug_mode=False
)
# Invalid usage
try:
invalid_settings = SettingsModel(enabled='yes')
except ValidationException as e:
print(e.validations) # {'enabled': 'Must be a boolean'}
Parameters
message
(str, optional): Custom error message. Default: 'Must be a boolean'
is_integer
Validates that the field is an integer.
from pyvalidx.types import is_integer
class CounterModel(ValidatedModel):
count: int = field_validated(is_integer())
max_items: int = field_validated(is_integer('Max items must be an integer'))
# Valid usage
counter = CounterModel(
count=42,
max_items=100
)
# Invalid usage
try:
invalid_counter = CounterModel(count='not a number')
except ValidationException as e:
print(e.validations) # {'count': 'Must be an integer'}
Parameters
message
(str, optional): Custom error message. Default: 'Must be an integer'
is_float
Validates that the field is a float.
from pyvalidx.types import is_float
class MeasurementModel(ValidatedModel):
temperature: float = field_validated(is_float())
pressure: float = field_validated(is_float('Pressure must be a decimal number'))
# Valid usage
measurement = MeasurementModel(
temperature=23.5,
pressure=1013.25
)
# Invalid usage
try:
invalid_measurement = MeasurementModel(temperature='hot')
except ValidationException as e:
print(e.validations) # {'temperature': 'Must be a float'}
Parameters
message
(str, optional): Custom error message. Default: 'Must be a float'
is_in
Validates that the field value is within a predefined set of valid values.
from pyvalidx.types import is_in
class UserModel(ValidatedModel):
role: str = field_validated(is_in(['admin', 'user', 'guest']))
status: str = field_validated(
is_in(['active', 'inactive', 'pending'], 'Invalid user status')
)
# Valid usage
user = UserModel(
role='admin',
status='active'
)
# Invalid usage
try:
invalid_user = UserModel(role='invalid_role')
except ValidationException as e:
print(e.validations) # {'role': 'Must be one of: ['admin', 'user', 'guest']'}
Parameters
choices
(Union[List[Any], Set[Any]]): List or set of valid valuesmessage
(str, optional): Custom error message
Complete Example: Configuration System
from pyvalidx import ValidatedModel, field_validated
from pyvalidx.core import is_required
from pyvalidx.types import is_dict, is_list, is_boolean, is_in
from pyvalidx.numeric import is_positive, min_value, max_value
class ApplicationConfigModel(ValidatedModel):
# Basic configuration
app_name: str = field_validated(is_required('Application name is required'))
# Environment validation
environment: str = field_validated(
is_required('Environment is required'),
is_in(['development', 'staging', 'production'], 'Invalid environment')
)
# Feature flags
debug_mode: bool = field_validated(
is_required('Debug mode setting is required'),
is_boolean('Debug mode must be true or false')
)
# Database configuration
database_config: dict = field_validated(
is_required('Database configuration is required'),
is_dict('Database config must be a dictionary')
)
# Allowed hosts
allowed_hosts: list = field_validated(
is_required('Allowed hosts are required'),
is_list('Allowed hosts must be a list')
)
# Port configuration
port: int = field_validated(
is_required('Port is required'),
is_positive('Port must be positive'),
min_value(1024, 'Port must be at least 1024'),
max_value(65535, 'Port must be at most 65535')
)
# Valid usage
config = ApplicationConfigModel(
app_name='MyWebApp',
environment='production',
debug_mode=False,
database_config={
'host': 'localhost',
'port': 5432,
'name': 'myapp_db'
},
allowed_hosts=['example.com', 'www.example.com'],
port=8080
)
Example: JSON Data Validation
from pyvalidx.types import is_dict, is_list
from pyvalidx.string import is_email
class ApiRequestModel(ValidatedModel):
user_data: dict = field_validated(
is_required('User data is required'),
is_dict('User data must be a valid JSON object')
)
tags: list = field_validated(
is_list('Tags must be an array')
)
action: str = field_validated(
is_required('Action is required'),
is_in(['create', 'update', 'delete'], 'Invalid action type')
)
# Valid usage
api_request = ApiRequestModel(
user_data={
'name': 'John Doe',
'email': 'john@example.com',
'age': 30
},
tags=['important', 'user', 'profile'],
action='create'
)
# Invalid usage
try:
invalid_request = ApiRequestModel(
user_data='not a dict',
tags='not a list',
action='invalid_action'
)
except ValidationException as e:
print(e.validations)
# Multiple validation errors will be shown
Example: Game Configuration
from pyvalidx.types import is_in, is_boolean, is_integer
class GameSettingsModel(ValidatedModel):
difficulty: str = field_validated(
is_required('Difficulty is required'),
is_in(['easy', 'medium', 'hard', 'expert'], 'Invalid difficulty level')
)
sound_enabled: bool = field_validated(
is_boolean('Sound setting must be true or false')
)
max_players: int = field_validated(
is_required('Max players is required'),
is_integer('Max players must be a number'),
is_in([2, 4, 6, 8], 'Max players must be 2, 4, 6, or 8')
)
game_modes: list = field_validated(
is_required('Game modes are required'),
is_list('Game modes must be a list')
)
# Usage
game_settings = GameSettingsModel(
difficulty='medium',
sound_enabled=True,
max_players=4,
game_modes=['classic', 'tournament', 'practice']
)
Important Notes
- Type validators return
True
if the value isNone
(for optional fields) is_in
validator performs case-sensitive comparison- For
is_in
, you can use both lists and sets for better performance with large choice sets - Type validators can be combined with other validators for comprehensive validation
- When using
is_in
with numbers, ensure the choices match the expected data type