Constraints
pytypeinput uses Pydantic's Field to add validation constraints to parameters.
String Constraints
Min/Max Length
Limit string length:
from dataclasses import dataclass
from pytypeinput import Field, Annotated, analyze_dataclass
@dataclass
class UserForm:
username: Annotated[str, Field(min_length=3, max_length=20)]
bio: Annotated[str, Field(max_length=500)]
params = analyze_dataclass(UserForm)
print(params[0].constraints) # Field(min_length=3, max_length=20)
print(params[1].constraints) # Field(max_length=500)
HTML Renderer Demo:
Try typing less than 3 or more than 20 characters!
Pattern (Regex)
Validate with regular expressions:
from dataclasses import dataclass
from pytypeinput import Field, PatternMessage, Annotated, analyze_dataclass
@dataclass
class AccountForm:
username: Annotated[
str,
Field(pattern=r'^[a-zA-Z0-9_]+$'),
PatternMessage("Only letters, numbers, and underscores allowed")
]
params = analyze_dataclass(AccountForm)
print(params[0].constraints) # Field(pattern=...)
print(params[0].ui.pattern_message) # "Only letters, numbers..."
HTML Renderer Demo:
Try entering special characters like @ or #!
Integer Constraints
Range (ge/le)
Constrain integer values with greater-or-equal (ge) and less-or-equal (le):
from dataclasses import dataclass
from pytypeinput import Field, Annotated, analyze_dataclass
@dataclass
class UserForm:
age: Annotated[int, Field(ge=18, le=120)]
rating: Annotated[int, Field(ge=1, le=5)]
params = analyze_dataclass(UserForm)
print(params[0].constraints) # Field(ge=18, le=120)
print(params[1].constraints) # Field(ge=1, le=5)
HTML Renderer Demo:
Try entering values outside the allowed range!
Strict Bounds (gt/lt)
Use greater-than (gt) and less-than (lt) for exclusive bounds:
from dataclasses import dataclass
from pytypeinput import Field, Annotated, analyze_dataclass
@dataclass
class ScoreForm:
percentage: Annotated[int, Field(gt=0, lt=100)] # 1-99
params = analyze_dataclass(ScoreForm)
print(params[0].constraints) # Field(gt=0, lt=100)
HTML Renderer Demo:
Values 0 and 100 are not allowed!
Float Constraints
Range (ge/le)
Constrain decimal values:
from dataclasses import dataclass
from pytypeinput import Field, Annotated, analyze_dataclass
@dataclass
class ProductForm:
price: Annotated[float, Field(ge=0.0, le=9999.99)]
rating: Annotated[float, Field(ge=0.0, le=5.0)]
params = analyze_dataclass(ProductForm)
print(params[0].constraints) # Field(ge=0.0, le=9999.99)
print(params[1].constraints) # Field(ge=0.0, le=5.0)
HTML Renderer Demo:
Strict Bounds (gt/lt)
Exclusive bounds for floats:
from dataclasses import dataclass
from pytypeinput import Field, Annotated, analyze_dataclass
@dataclass
class MeasurementForm:
temperature: Annotated[float, Field(gt=-273.15)] # Above absolute zero
params = analyze_dataclass(MeasurementForm)
print(params[0].constraints) # Field(gt=-273.15)
HTML Renderer Demo:
List Constraints
List Length
Limit the number of items in a list:
from dataclasses import dataclass
from pytypeinput import Field, Annotated, analyze_dataclass
@dataclass
class TagsForm:
tags: Annotated[list[str], Field(min_length=1, max_length=5)]
categories: Annotated[list[str], Field(min_length=2)]
params = analyze_dataclass(TagsForm)
print(params[0].list.constraints) # Field(min_length=1, max_length=5)
print(params[1].list.constraints) # Field(min_length=2)
HTML Renderer Demo:
Try adding/removing items - the + and × buttons are disabled when limits are reached!
Item Constraints
Apply constraints to individual list items:
from dataclasses import dataclass
from pytypeinput import Field, Annotated, analyze_dataclass
@dataclass
class ScoresForm:
scores: list[Annotated[int, Field(ge=0, le=100)]]
names: list[Annotated[str, Field(min_length=2, max_length=50)]]
params = analyze_dataclass(ScoresForm)
print(params[0].constraints) # Field(ge=0, le=100) - for each item
print(params[1].constraints) # Field(min_length=2, max_length=50) - for each item
HTML Renderer Demo:
Each item is validated individually!
Combined List Constraints
Constrain both list length and item values:
from dataclasses import dataclass
from pytypeinput import Field, Annotated, analyze_dataclass
@dataclass
class TestForm:
answers: Annotated[
list[Annotated[int, Field(ge=1, le=5)]],
Field(min_length=5, max_length=10)
]
params = analyze_dataclass(TestForm)
print(params[0].list.constraints) # Field(min_length=5, max_length=10)
print(params[0].constraints) # Field(ge=1, le=5)
HTML Renderer Demo:
Must have 5-10 items, each between 1-5!
Combined Constraints
Multiple constraints on a single field:
from dataclasses import dataclass
from pytypeinput import Field, PatternMessage, Annotated, analyze_dataclass
@dataclass
class RegistrationForm:
username: Annotated[
str,
Field(
min_length=3,
max_length=20,
pattern=r'^[a-zA-Z0-9_]+$'
),
PatternMessage("Only letters, numbers, and underscores")
]
age: Annotated[int, Field(ge=13, le=120)]
params = analyze_dataclass(RegistrationForm)
HTML Renderer Demo: