Skip to content
You're viewing docs for v2.4. See the latest version →

Pydantic Types

The types module contains custom types used by pydantic.

Strict

Bases: PydanticMetadata, BaseMetadata

A field metadata class to indicate that a field should be validated in strict mode.

Attributes

strict

Whether to validate the field in strict mode.

Type: bool

AllowInfNan

Bases: PydanticMetadata

A field metadata class to indicate that a field should allow -inf, inf, and nan.

StringConstraints

Bases: GroupedMetadata

Apply constraints to str types.

Attributes

strip_whitespace

Whether to strip whitespace from the string.

Type: bool | None

to_upper

Whether to convert the string to uppercase.

Type: bool | None

to_lower

Whether to convert the string to lowercase.

Type: bool | None

strict

Whether to validate the string in strict mode.

Type: bool | None

min_length

The minimum length of the string.

Type: int | None

max_length

The maximum length of the string.

Type: int | None

pattern

A regex pattern that the string must match.

Type: str | None

ImportString

A type that can be used to import a type from a string.

ImportString expects a string and loads the Python object importable at that dotted path. Attributes of modules may be separated from the module by : or ., e.g. if 'math:cos' was provided, the resulting field value would be the functioncos. If a . is used and both an attribute and submodule are present at the same path, the module will be preferred.

On model instantiation, pointers will be evaluated and imported. There is some nuance to this behavior, demonstrated in the examples below.

A known limitation: setting a default value to a string won’t result in validation (thus evaluation). This is actively being worked on.

Good behavior:

from math import cos

from pydantic import BaseModel, ImportString, ValidationError


class ImportThings(BaseModel):
    obj: ImportString


# A string value will cause an automatic import
my_cos = ImportThings(obj='math.cos')

# You can use the imported function as you would expect
cos_of_0 = my_cos.obj(0)
assert cos_of_0 == 1


# A string whose value cannot be imported will raise an error
try:
    ImportThings(obj='foo.bar')
except ValidationError as e:
    print(e)
    '''
    1 validation error for ImportThings
    obj
    Invalid python path: No module named 'foo.bar' [type=import_error, input_value='foo.bar', input_type=str]
    '''


# Actual python objects can be assigned as well
my_cos = ImportThings(obj=cos)
my_cos_2 = ImportThings(obj='math.cos')
assert my_cos == my_cos_2

Serializing an ImportString type to json is also possible.

from pydantic import BaseModel, ImportString


class ImportThings(BaseModel):
    obj: ImportString


# Create an instance
m = ImportThings(obj='math:cos')
print(m)
#> obj=<built-in function cos>
print(m.model_dump_json())
#> {"obj":"math.cos"}

UuidVersion

A field metadata class to indicate a UUID version.

Json

A special type wrapper which loads JSON before parsing.

You can use the Json data type to make Pydantic first load a raw JSON string before validating the loaded data into the parametrized type:

from typing import Any, List

from pydantic import BaseModel, Json, ValidationError


class AnyJsonModel(BaseModel):
    json_obj: Json[Any]


class ConstrainedJsonModel(BaseModel):
    json_obj: Json[List[int]]


print(AnyJsonModel(json_obj='{"b": 1}'))
#> json_obj={'b': 1}
print(ConstrainedJsonModel(json_obj='[1, 2, 3]'))
#> json_obj=[1, 2, 3]

try:
    ConstrainedJsonModel(json_obj=12)
except ValidationError as e:
    print(e)
    '''
    1 validation error for ConstrainedJsonModel
    json_obj
    JSON input should be string, bytes or bytearray [type=json_type, input_value=12, input_type=int]
    '''

try:
    ConstrainedJsonModel(json_obj='[a, b]')
except ValidationError as e:
    print(e)
    '''
    1 validation error for ConstrainedJsonModel
    json_obj
    Invalid JSON: expected value at line 1 column 2 [type=json_invalid, input_value='[a, b]', input_type=str]
    '''

try:
    ConstrainedJsonModel(json_obj='["a", "b"]')
except ValidationError as e:
    print(e)
    '''
    2 validation errors for ConstrainedJsonModel
    json_obj.0
    Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='a', input_type=str]
    json_obj.1
    Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='b', input_type=str]
    '''

When you dump the model using model_dump or model_dump_json, the dumped value will be the result of validation, not the original JSON string. However, you can use the argument round_trip=True to get the original JSON string back:

from typing import List

from pydantic import BaseModel, Json


class ConstrainedJsonModel(BaseModel):
    json_obj: Json[List[int]]


print(ConstrainedJsonModel(json_obj='[1, 2, 3]').model_dump_json())
#> {"json_obj":[1,2,3]}
print(
    ConstrainedJsonModel(json_obj='[1, 2, 3]').model_dump_json(round_trip=True)
)
#> {"json_obj":"[1,2,3]"}

SecretStr

Bases: _SecretField[str]

A string used for storing sensitive information that you do not want to be visible in logging or tracebacks.

It displays '**********' instead of the string value on repr() and str() calls.

from pydantic import BaseModel, SecretStr

class User(BaseModel):
    username: str
    password: SecretStr

user = User(username='scolvin', password='password1')

print(user)
#> username='scolvin' password=SecretStr('**********')
print(user.password.get_secret_value())
#> password1

SecretBytes

Bases: _SecretField[bytes]

A bytes used for storing sensitive information that you do not want to be visible in logging or tracebacks.

It displays b'**********' instead of the string value on repr() and str() calls.

from pydantic import BaseModel, SecretBytes

class User(BaseModel):
    username: str
    password: SecretBytes

user = User(username='scolvin', password=b'password1')
#> username='scolvin' password=SecretBytes(b'**********')
print(user.password.get_secret_value())
#> b'password1'

PaymentCardNumber

Bases: str

Based on: https://en.wikipedia.org/wiki/Payment_card_number.

Attributes

masked

Mask all but the last 4 digits of the card number.

Type: str

Methods

validate

@classmethod

def validate(
    cls,
    __input_value: str,
    _: core_schema.ValidationInfo,
) -> PaymentCardNumber

Validate the card number and return a PaymentCardNumber instance.

Returns

PaymentCardNumber

validate_digits

@classmethod

def validate_digits(cls, card_number: str) -> None

Validate that the card number is all digits.

Returns

None

validate_luhn_check_digit

@classmethod

def validate_luhn_check_digit(cls, card_number: str) -> str

Based on: https://en.wikipedia.org/wiki/Luhn_algorithm.

Returns

str

validate_brand

@staticmethod

def validate_brand(card_number: str) -> PaymentCardBrand

Validate length based on BIN for major brands: https://en.wikipedia.org/wiki/Payment_card_number#Issuer_identification_number_(IIN).

Returns

PaymentCardBrand

ByteSize

Bases: int

Converts a string representing a number of bytes with units (such as '1KB' or '11.5MiB') into an integer.

You can use the ByteSize data type to (case-insensitively) convert a string representation of a number of bytes into an integer, and also to print out human-readable strings representing a number of bytes.

In conformance with IEC 80000-13 Standard we interpret '1KB' to mean 1000 bytes, and '1KiB' to mean 1024 bytes. In general, including a middle 'i' will cause the unit to be interpreted as a power of 2, rather than a power of 10 (so, for example, '1 MB' is treated as 1_000_000 bytes, whereas '1 MiB' is treated as 1_048_576 bytes).

from pydantic import BaseModel, ByteSize

class MyModel(BaseModel):
    size: ByteSize

print(MyModel(size=52000).size)
#> 52000
print(MyModel(size='3000 KiB').size)
#> 3072000

m = MyModel(size='50 PB')
print(m.size.human_readable())
#> 44.4PiB
print(m.size.human_readable(decimal=True))
#> 50.0PB

print(m.size.to('TiB'))
#> 45474.73508864641

Methods

human_readable

def human_readable(decimal: bool = False) -> str

Converts a byte size to a human readable string.

Returns

str — A human readable string representation of the byte size.

Parameters

decimal : bool Default: False

If True, use decimal units (e.g. 1000 bytes per KB). If False, use binary units (e.g. 1024 bytes per KiB).

to

def to(unit: str) -> float

Converts a byte size to another unit.

Returns

float — The byte size in the new unit.

Parameters

unit : str

The unit to convert to. Must be one of the following: B, KB, MB, GB, TB, PB, EiB, KiB, MiB, GiB, TiB, PiB, EiB.

PastDate

A date in the past.

FutureDate

A date in the future.

AwareDatetime

A datetime that requires timezone info.

NaiveDatetime

A datetime that doesn’t require timezone info.

PastDatetime

A datetime that must be in the past.

FutureDatetime

A datetime that must be in the future.

EncoderProtocol

Bases: Protocol

Protocol for encoding and decoding data to and from bytes.

Methods

decode

@classmethod

def decode(cls, data: bytes) -> bytes

Decode the data using the encoder.

Returns

bytes — The decoded data.

Parameters

data : bytes

The data to decode.

encode

@classmethod

def encode(cls, value: bytes) -> bytes

Encode the data using the encoder.

Returns

bytes — The encoded data.

Parameters

value : bytes

The data to encode.

get_json_format

@classmethod

def get_json_format(cls) -> str

Get the JSON format for the encoded data.

Returns

str — The JSON format for the encoded data.

Base64Encoder

Bases: EncoderProtocol

Standard (non-URL-safe) Base64 encoder.

Methods

decode

@classmethod

def decode(cls, data: bytes) -> bytes

Decode the data from base64 encoded bytes to original bytes data.

Returns

bytes — The decoded data.

Parameters

data : bytes

The data to decode.

encode

@classmethod

def encode(cls, value: bytes) -> bytes

Encode the data from bytes to a base64 encoded bytes.

Returns

bytes — The encoded data.

Parameters

value : bytes

The data to encode.

get_json_format

@classmethod

def get_json_format(cls) -> Literal['base64']

Get the JSON format for the encoded data.

Returns

Literal[‘base64’] — The JSON format for the encoded data.

Base64UrlEncoder

Bases: EncoderProtocol

URL-safe Base64 encoder.

Methods

decode

@classmethod

def decode(cls, data: bytes) -> bytes

Decode the data from base64 encoded bytes to original bytes data.

Returns

bytes — The decoded data.

Parameters

data : bytes

The data to decode.

encode

@classmethod

def encode(cls, value: bytes) -> bytes

Encode the data from bytes to a base64 encoded bytes.

Returns

bytes — The encoded data.

Parameters

value : bytes

The data to encode.

get_json_format

@classmethod

def get_json_format(cls) -> Literal['base64url']

Get the JSON format for the encoded data.

Returns

Literal[‘base64url’] — The JSON format for the encoded data.

EncodedBytes

A bytes type that is encoded and decoded using the specified encoder.

EncodedBytes needs an encoder that implements EncoderProtocol to operate.

from typing_extensions import Annotated

from pydantic import BaseModel, EncodedBytes, EncoderProtocol, ValidationError

class MyEncoder(EncoderProtocol):
    @classmethod
    def decode(cls, data: bytes) -> bytes:
        if data == b'**undecodable**':
            raise ValueError('Cannot decode data')
        return data[13:]

    @classmethod
    def encode(cls, value: bytes) -> bytes:
        return b'**encoded**: ' + value

    @classmethod
    def get_json_format(cls) -> str:
        return 'my-encoder'

MyEncodedBytes = Annotated[bytes, EncodedBytes(encoder=MyEncoder)]

class Model(BaseModel):
    my_encoded_bytes: MyEncodedBytes

# Initialize the model with encoded data
m = Model(my_encoded_bytes=b'**encoded**: some bytes')

# Access decoded value
print(m.my_encoded_bytes)
#> b'some bytes'

# Serialize into the encoded form
print(m.model_dump())
#> {'my_encoded_bytes': b'**encoded**: some bytes'}

# Validate encoded data
try:
    Model(my_encoded_bytes=b'**undecodable**')
except ValidationError as e:
    print(e)
    '''
    1 validation error for Model
    my_encoded_bytes
      Value error, Cannot decode data [type=value_error, input_value=b'**undecodable**', input_type=bytes]
    '''

Methods

decode

def decode(data: bytes, _: core_schema.ValidationInfo) -> bytes

Decode the data using the specified encoder.

Returns

bytes — The decoded data.

Parameters

data : bytes

The data to decode.

encode

def encode(value: bytes) -> bytes

Encode the data using the specified encoder.

Returns

bytes — The encoded data.

Parameters

value : bytes

The data to encode.

EncodedStr

Bases: EncodedBytes

A str type that is encoded and decoded using the specified encoder.

EncodedStr needs an encoder that implements EncoderProtocol to operate.

from typing_extensions import Annotated

from pydantic import BaseModel, EncodedStr, EncoderProtocol, ValidationError

class MyEncoder(EncoderProtocol):
    @classmethod
    def decode(cls, data: bytes) -> bytes:
        if data == b'**undecodable**':
            raise ValueError('Cannot decode data')
        return data[13:]

    @classmethod
    def encode(cls, value: bytes) -> bytes:
        return b'**encoded**: ' + value

    @classmethod
    def get_json_format(cls) -> str:
        return 'my-encoder'

MyEncodedStr = Annotated[str, EncodedStr(encoder=MyEncoder)]

class Model(BaseModel):
    my_encoded_str: MyEncodedStr

# Initialize the model with encoded data
m = Model(my_encoded_str='**encoded**: some str')

# Access decoded value
print(m.my_encoded_str)
#> some str

# Serialize into the encoded form
print(m.model_dump())
#> {'my_encoded_str': '**encoded**: some str'}

# Validate encoded data
try:
    Model(my_encoded_str='**undecodable**')
except ValidationError as e:
    print(e)
    '''
    1 validation error for Model
    my_encoded_str
      Value error, Cannot decode data [type=value_error, input_value='**undecodable**', input_type=str]
    '''

Methods

decode_str

def decode_str(data: bytes, _: core_schema.ValidationInfo) -> str

Decode the data using the specified encoder.

Returns

str — The decoded data.

Parameters

data : bytes

The data to decode.

encode_str

def encode_str(value: str) -> str

Encode the data using the specified encoder.

Returns

str — The encoded data.

Parameters

value : str

The data to encode.

GetPydanticSchema

A convenience class for creating an annotation that provides pydantic custom type hooks.

This class is intended to eliminate the need to create a custom “marker” which defines the __get_pydantic_core_schema__ and __get_pydantic_json_schema__ custom hook methods.

For example, to have a field treated by type checkers as int, but by pydantic as Any, you can do:

from typing import Any

from typing_extensions import Annotated

from pydantic import BaseModel, GetPydanticSchema

HandleAsAny = GetPydanticSchema(lambda _s, h: h(Any))

class Model(BaseModel):
    x: Annotated[int, HandleAsAny]  # pydantic sees `x: Any`

print(repr(Model(x='abc').x))
#> 'abc'

conint

def conint(
    strict: bool | None = None,
    gt: int | None = None,
    ge: int | None = None,
    lt: int | None = None,
    le: int | None = None,
    multiple_of: int | None = None,
) -> type[int]
from pydantic import BaseModel, conint

class Foo(BaseModel):
    bar: conint(strict=True, gt=0)

A wrapper around int that allows for additional constraints.

from pydantic import BaseModel, ValidationError, conint

class ConstrainedExample(BaseModel):
    constrained_int: conint(gt=1)

m = ConstrainedExample(constrained_int=2)
print(repr(m))
#> ConstrainedExample(constrained_int=2)

try:
    ConstrainedExample(constrained_int=0)
except ValidationError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'greater_than',
            'loc': ('constrained_int',),
            'msg': 'Input should be greater than 1',
            'input': 0,
            'ctx': {'gt': 1},
            'url': 'https://errors.pydantic.dev/2/v/greater_than',
        }
    ]
    '''

Returns

type[int] — The wrapped integer type.

Parameters

strict : bool | None Default: None

Whether to validate the integer in strict mode. Defaults to None.

gt : int | None Default: None

The value must be greater than this.

ge : int | None Default: None

The value must be greater than or equal to this.

lt : int | None Default: None

The value must be less than this.

le : int | None Default: None

The value must be less than or equal to this.

multiple_of : int | None Default: None

The value must be a multiple of this.

confloat

def confloat(
    strict: bool | None = None,
    gt: float | None = None,
    ge: float | None = None,
    lt: float | None = None,
    le: float | None = None,
    multiple_of: float | None = None,
    allow_inf_nan: bool | None = None,
) -> type[float]
from pydantic import BaseModel, confloat

class Foo(BaseModel):
    bar: confloat(strict=True, gt=0)

A wrapper around float that allows for additional constraints.

from pydantic import BaseModel, ValidationError, confloat

class ConstrainedExample(BaseModel):
    constrained_float: confloat(gt=1.0)

m = ConstrainedExample(constrained_float=1.1)
print(repr(m))
#> ConstrainedExample(constrained_float=1.1)

try:
    ConstrainedExample(constrained_float=0.9)
except ValidationError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'greater_than',
            'loc': ('constrained_float',),
            'msg': 'Input should be greater than 1',
            'input': 0.9,
            'ctx': {'gt': 1.0},
            'url': 'https://errors.pydantic.dev/2/v/greater_than',
        }
    ]
    '''

Returns

type[float] — The wrapped float type.

Parameters

strict : bool | None Default: None

Whether to validate the float in strict mode.

gt : float | None Default: None

The value must be greater than this.

ge : float | None Default: None

The value must be greater than or equal to this.

lt : float | None Default: None

The value must be less than this.

le : float | None Default: None

The value must be less than or equal to this.

multiple_of : float | None Default: None

The value must be a multiple of this.

allow_inf_nan : bool | None Default: None

Whether to allow -inf, inf, and nan.

conbytes

def conbytes(
    min_length: int | None = None,
    max_length: int | None = None,
    strict: bool | None = None,
) -> type[bytes]

A wrapper around bytes that allows for additional constraints.

Returns

type[bytes] — The wrapped bytes type.

Parameters

min_length : int | None Default: None

The minimum length of the bytes.

max_length : int | None Default: None

The maximum length of the bytes.

strict : bool | None Default: None

Whether to validate the bytes in strict mode.

constr

def constr(
    strip_whitespace: bool | None = None,
    to_upper: bool | None = None,
    to_lower: bool | None = None,
    strict: bool | None = None,
    min_length: int | None = None,
    max_length: int | None = None,
    pattern: str | None = None,
) -> type[str]
from pydantic import BaseModel, constr

class Foo(BaseModel):
    bar: constr(strip_whitespace=True, to_upper=True, pattern=r'^[A-Z]+$')

A wrapper around str that allows for additional constraints.

from pydantic import BaseModel, constr

class Foo(BaseModel):
    bar: constr(strip_whitespace=True, to_upper=True, pattern=r'^[A-Z]+$')


foo = Foo(bar='  hello  ')
print(foo)
#> bar='HELLO'

Returns

type[str] — The wrapped string type.

Parameters

strip_whitespace : bool | None Default: None

Whether to remove leading and trailing whitespace.

to_upper : bool | None Default: None

Whether to turn all characters to uppercase.

to_lower : bool | None Default: None

Whether to turn all characters to lowercase.

strict : bool | None Default: None

Whether to validate the string in strict mode.

min_length : int | None Default: None

The minimum length of the string.

max_length : int | None Default: None

The maximum length of the string.

pattern : str | None Default: None

A regex pattern to validate the string against.

conset

def conset(
    item_type: type[HashableItemType],
    min_length: int | None = None,
    max_length: int | None = None,
) -> type[set[HashableItemType]]

A wrapper around typing.Set that allows for additional constraints.

Returns

type[set[HashableItemType]] — The wrapped set type.

Parameters

item_type : type[HashableItemType]

The type of the items in the set.

min_length : int | None Default: None

The minimum length of the set.

max_length : int | None Default: None

The maximum length of the set.

confrozenset

def confrozenset(
    item_type: type[HashableItemType],
    min_length: int | None = None,
    max_length: int | None = None,
) -> type[frozenset[HashableItemType]]

A wrapper around typing.FrozenSet that allows for additional constraints.

Returns

type[frozenset[HashableItemType]] — The wrapped frozenset type.

Parameters

item_type : type[HashableItemType]

The type of the items in the frozenset.

min_length : int | None Default: None

The minimum length of the frozenset.

max_length : int | None Default: None

The maximum length of the frozenset.

conlist

def conlist(
    item_type: type[AnyItemType],
    min_length: int | None = None,
    max_length: int | None = None,
    unique_items: bool | None = None,
) -> type[list[AnyItemType]]

A wrapper around typing.List that adds validation.

Returns

type[list[AnyItemType]] — The wrapped list type.

Parameters

item_type : type[AnyItemType]

The type of the items in the list.

min_length : int | None Default: None

The minimum length of the list. Defaults to None.

max_length : int | None Default: None

The maximum length of the list. Defaults to None.

unique_items : bool | None Default: None

Whether the items in the list must be unique. Defaults to None.

condecimal

def condecimal(
    strict: bool | None = None,
    gt: int | Decimal | None = None,
    ge: int | Decimal | None = None,
    lt: int | Decimal | None = None,
    le: int | Decimal | None = None,
    multiple_of: int | Decimal | None = None,
    max_digits: int | None = None,
    decimal_places: int | None = None,
    allow_inf_nan: bool | None = None,
) -> type[Decimal]
from pydantic import BaseModel, condecimal

class Foo(BaseModel):
    bar: condecimal(strict=True, allow_inf_nan=True)

A wrapper around Decimal that adds validation.

from decimal import Decimal

from pydantic import BaseModel, ValidationError, condecimal

class ConstrainedExample(BaseModel):
    constrained_decimal: condecimal(gt=Decimal('1.0'))

m = ConstrainedExample(constrained_decimal=Decimal('1.1'))
print(repr(m))
#> ConstrainedExample(constrained_decimal=Decimal('1.1'))

try:
    ConstrainedExample(constrained_decimal=Decimal('0.9'))
except ValidationError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'greater_than',
            'loc': ('constrained_decimal',),
            'msg': 'Input should be greater than 1.0',
            'input': Decimal('0.9'),
            'ctx': {'gt': Decimal('1.0')},
            'url': 'https://errors.pydantic.dev/2/v/greater_than',
        }
    ]
    '''

Returns

type[Decimal]

Parameters

strict : bool | None Default: None

Whether to validate the value in strict mode. Defaults to None.

gt : int | Decimal | None Default: None

The value must be greater than this. Defaults to None.

ge : int | Decimal | None Default: None

The value must be greater than or equal to this. Defaults to None.

lt : int | Decimal | None Default: None

The value must be less than this. Defaults to None.

le : int | Decimal | None Default: None

The value must be less than or equal to this. Defaults to None.

multiple_of : int | Decimal | None Default: None

The value must be a multiple of this. Defaults to None.

max_digits : int | None Default: None

The maximum number of digits. Defaults to None.

decimal_places : int | None Default: None

The number of decimal places. Defaults to None.

allow_inf_nan : bool | None Default: None

Whether to allow infinity and NaN. Defaults to None.

condate

def condate(
    strict: bool | None = None,
    gt: date | None = None,
    ge: date | None = None,
    lt: date | None = None,
    le: date | None = None,
) -> type[date]

A wrapper for date that adds constraints.

Returns

type[date] — A date type with the specified constraints.

Parameters

strict : bool | None Default: None

Whether to validate the date value in strict mode. Defaults to None.

gt : date | None Default: None

The value must be greater than this. Defaults to None.

ge : date | None Default: None

The value must be greater than or equal to this. Defaults to None.

lt : date | None Default: None

The value must be less than this. Defaults to None.

le : date | None Default: None

The value must be less than or equal to this. Defaults to None.

StrictBool

A boolean that must be either True or False.

Default: Annotated[bool, Strict()]

PositiveInt

An integer that must be greater than zero.

from pydantic import BaseModel, PositiveInt, ValidationError

class Model(BaseModel):
    positive_int: PositiveInt

m = Model(positive_int=1)
print(repr(m))
#> Model(positive_int=1)

try:
    Model(positive_int=-1)
except ValidationError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'greater_than',
            'loc': ('positive_int',),
            'msg': 'Input should be greater than 0',
            'input': -1,
            'ctx': {'gt': 0},
            'url': 'https://errors.pydantic.dev/2/v/greater_than',
        }
    ]
    '''

Default: Annotated[int, annotated_types.Gt(0)]

NegativeInt

An integer that must be less than zero.

from pydantic import BaseModel, NegativeInt, ValidationError

class Model(BaseModel):
    negative_int: NegativeInt

m = Model(negative_int=-1)
print(repr(m))
#> Model(negative_int=-1)

try:
    Model(negative_int=1)
except ValidationError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'less_than',
            'loc': ('negative_int',),
            'msg': 'Input should be less than 0',
            'input': 1,
            'ctx': {'lt': 0},
            'url': 'https://errors.pydantic.dev/2/v/less_than',
        }
    ]
    '''

Default: Annotated[int, annotated_types.Lt(0)]

NonPositiveInt

An integer that must be less than or equal to zero.

from pydantic import BaseModel, NonPositiveInt, ValidationError

class Model(BaseModel):
    non_positive_int: NonPositiveInt

m = Model(non_positive_int=0)
print(repr(m))
#> Model(non_positive_int=0)

try:
    Model(non_positive_int=1)
except ValidationError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'less_than_equal',
            'loc': ('non_positive_int',),
            'msg': 'Input should be less than or equal to 0',
            'input': 1,
            'ctx': {'le': 0},
            'url': 'https://errors.pydantic.dev/2/v/less_than_equal',
        }
    ]
    '''

Default: Annotated[int, annotated_types.Le(0)]

NonNegativeInt

An integer that must be greater than or equal to zero.

from pydantic import BaseModel, NonNegativeInt, ValidationError

class Model(BaseModel):
    non_negative_int: NonNegativeInt

m = Model(non_negative_int=0)
print(repr(m))
#> Model(non_negative_int=0)

try:
    Model(non_negative_int=-1)
except ValidationError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'greater_than_equal',
            'loc': ('non_negative_int',),
            'msg': 'Input should be greater than or equal to 0',
            'input': -1,
            'ctx': {'ge': 0},
            'url': 'https://errors.pydantic.dev/2/v/greater_than_equal',
        }
    ]
    '''

Default: Annotated[int, annotated_types.Ge(0)]

StrictInt

An integer that must be validated in strict mode.

from pydantic import BaseModel, StrictInt, ValidationError

class StrictIntModel(BaseModel):
    strict_int: StrictInt

try:
    StrictIntModel(strict_int=3.14159)
except ValidationError as e:
    print(e)
    '''
    1 validation error for StrictIntModel
    strict_int
      Input should be a valid integer [type=int_type, input_value=3.14159, input_type=float]
    '''

Default: Annotated[int, Strict()]

PositiveFloat

A float that must be greater than zero.

from pydantic import BaseModel, PositiveFloat, ValidationError

class Model(BaseModel):
    positive_float: PositiveFloat

m = Model(positive_float=1.0)
print(repr(m))
#> Model(positive_float=1.0)

try:
    Model(positive_float=-1.0)
except ValidationError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'greater_than',
            'loc': ('positive_float',),
            'msg': 'Input should be greater than 0',
            'input': -1.0,
            'ctx': {'gt': 0.0},
            'url': 'https://errors.pydantic.dev/2/v/greater_than',
        }
    ]
    '''

Default: Annotated[float, annotated_types.Gt(0)]

NegativeFloat

A float that must be less than zero.

from pydantic import BaseModel, NegativeFloat, ValidationError

class Model(BaseModel):
    negative_float: NegativeFloat

m = Model(negative_float=-1.0)
print(repr(m))
#> Model(negative_float=-1.0)

try:
    Model(negative_float=1.0)
except ValidationError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'less_than',
            'loc': ('negative_float',),
            'msg': 'Input should be less than 0',
            'input': 1.0,
            'ctx': {'lt': 0.0},
            'url': 'https://errors.pydantic.dev/2/v/less_than',
        }
    ]
    '''

Default: Annotated[float, annotated_types.Lt(0)]

NonPositiveFloat

A float that must be less than or equal to zero.

from pydantic import BaseModel, NonPositiveFloat, ValidationError

class Model(BaseModel):
    non_positive_float: NonPositiveFloat

m = Model(non_positive_float=0.0)
print(repr(m))
#> Model(non_positive_float=0.0)

try:
    Model(non_positive_float=1.0)
except ValidationError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'less_than_equal',
            'loc': ('non_positive_float',),
            'msg': 'Input should be less than or equal to 0',
            'input': 1.0,
            'ctx': {'le': 0.0},
            'url': 'https://errors.pydantic.dev/2/v/less_than_equal',
        }
    ]
    '''

Default: Annotated[float, annotated_types.Le(0)]

NonNegativeFloat

A float that must be greater than or equal to zero.

from pydantic import BaseModel, NonNegativeFloat, ValidationError

class Model(BaseModel):
    non_negative_float: NonNegativeFloat

m = Model(non_negative_float=0.0)
print(repr(m))
#> Model(non_negative_float=0.0)

try:
    Model(non_negative_float=-1.0)
except ValidationError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'greater_than_equal',
            'loc': ('non_negative_float',),
            'msg': 'Input should be greater than or equal to 0',
            'input': -1.0,
            'ctx': {'ge': 0.0},
            'url': 'https://errors.pydantic.dev/2/v/greater_than_equal',
        }
    ]
    '''

Default: Annotated[float, annotated_types.Ge(0)]

StrictFloat

A float that must be validated in strict mode.

from pydantic import BaseModel, StrictFloat, ValidationError

class StrictFloatModel(BaseModel):
    strict_float: StrictFloat

try:
    StrictFloatModel(strict_float='1.0')
except ValidationError as e:
    print(e)
    '''
    1 validation error for StrictFloatModel
    strict_float
      Input should be a valid number [type=float_type, input_value='1.0', input_type=str]
    '''

Default: Annotated[float, Strict(True)]

FiniteFloat

A float that must be finite (not -inf, inf, or nan).

from pydantic import BaseModel, FiniteFloat

class Model(BaseModel):
    finite: FiniteFloat

m = Model(finite=1.0)
print(m)
#> finite=1.0

Default: Annotated[float, AllowInfNan(False)]

StrictBytes

A bytes that must be validated in strict mode.

Default: Annotated[bytes, Strict()]

StrictStr

A string that must be validated in strict mode.

Default: Annotated[str, Strict()]

UUID1

A UUID that must be version 1.

import uuid

from pydantic import BaseModel, UUID1

class Model(BaseModel):
    uuid1: UUID1

Model(uuid1=uuid.uuid1())

Default: Annotated[UUID, UuidVersion(1)]

UUID3

A UUID that must be version 3.

import uuid

from pydantic import BaseModel, UUID3

class Model(BaseModel):
    uuid3: UUID3

Model(uuid3=uuid.uuid3(uuid.NAMESPACE_DNS, 'pydantic.org'))

Default: Annotated[UUID, UuidVersion(3)]

UUID4

A UUID that must be version 4.

import uuid

from pydantic import BaseModel, UUID4

class Model(BaseModel):
    uuid4: UUID4

Model(uuid4=uuid.uuid4())

Default: Annotated[UUID, UuidVersion(4)]

UUID5

A UUID that must be version 5.

import uuid

from pydantic import BaseModel, UUID5

class Model(BaseModel):
    uuid5: UUID5

Model(uuid5=uuid.uuid5(uuid.NAMESPACE_DNS, 'pydantic.org'))

Default: Annotated[UUID, UuidVersion(5)]

FilePath

A path that must point to a file.

from pathlib import Path

from pydantic import BaseModel, FilePath, ValidationError

class Model(BaseModel):
    f: FilePath

path = Path('text.txt')
path.touch()
m = Model(f='text.txt')
print(m.model_dump())
#> {'f': PosixPath('text.txt')}
path.unlink()

path = Path('directory')
path.mkdir(exist_ok=True)
try:
    Model(f='directory')  # directory
except ValidationError as e:
    print(e)
    '''
    1 validation error for Model
    f
      Path does not point to a file [type=path_not_file, input_value='directory', input_type=str]
    '''
path.rmdir()

try:
    Model(f='not-exists-file')
except ValidationError as e:
    print(e)
    '''
    1 validation error for Model
    f
      Path does not point to a file [type=path_not_file, input_value='not-exists-file', input_type=str]
    '''

Default: Annotated[Path, PathType('file')]

DirectoryPath

A path that must point to a directory.

from pathlib import Path

from pydantic import BaseModel, DirectoryPath, ValidationError

class Model(BaseModel):
    f: DirectoryPath

path = Path('directory/')
path.mkdir()
m = Model(f='directory/')
print(m.model_dump())
#> {'f': PosixPath('directory')}
path.rmdir()

path = Path('file.txt')
path.touch()
try:
    Model(f='file.txt')  # file
except ValidationError as e:
    print(e)
    '''
    1 validation error for Model
    f
      Path does not point to a directory [type=path_not_directory, input_value='file.txt', input_type=str]
    '''
path.unlink()

try:
    Model(f='not-exists-directory')
except ValidationError as e:
    print(e)
    '''
    1 validation error for Model
    f
      Path does not point to a directory [type=path_not_directory, input_value='not-exists-directory', input_type=str]
    '''

Default: Annotated[Path, PathType('dir')]

NewPath

A path for a new file or directory that must not already exist.

Default: Annotated[Path, PathType('new')]

Base64Bytes

A bytes type that is encoded and decoded using the standard (non-URL-safe) base64 encoder.

from pydantic import Base64Bytes, BaseModel, ValidationError

class Model(BaseModel):
    base64_bytes: Base64Bytes

# Initialize the model with base64 data
m = Model(base64_bytes=b'VGhpcyBpcyB0aGUgd2F5')

# Access decoded value
print(m.base64_bytes)
#> b'This is the way'

# Serialize into the base64 form
print(m.model_dump())
#> {'base64_bytes': b'VGhpcyBpcyB0aGUgd2F5
'}

# Validate base64 data
try:
    print(Model(base64_bytes=b'undecodable').base64_bytes)
except ValidationError as e:
    print(e)
    '''
    1 validation error for Model
    base64_bytes
      Base64 decoding error: 'Incorrect padding' [type=base64_decode, input_value=b'undecodable', input_type=bytes]
    '''

Default: Annotated[bytes, EncodedBytes(encoder=Base64Encoder)]

Base64Str

A str type that is encoded and decoded using the standard (non-URL-safe) base64 encoder.

from pydantic import Base64Str, BaseModel, ValidationError

class Model(BaseModel):
    base64_str: Base64Str

# Initialize the model with base64 data
m = Model(base64_str='VGhlc2UgYXJlbid0IHRoZSBkcm9pZHMgeW91J3JlIGxvb2tpbmcgZm9y')

# Access decoded value
print(m.base64_str)
#> These aren't the droids you're looking for

# Serialize into the base64 form
print(m.model_dump())
#> {'base64_str': 'VGhlc2UgYXJlbid0IHRoZSBkcm9pZHMgeW91J3JlIGxvb2tpbmcgZm9y
'}

# Validate base64 data
try:
    print(Model(base64_str='undecodable').base64_str)
except ValidationError as e:
    print(e)
    '''
    1 validation error for Model
    base64_str
      Base64 decoding error: 'Incorrect padding' [type=base64_decode, input_value='undecodable', input_type=str]
    '''

Default: Annotated[str, EncodedStr(encoder=Base64Encoder)]

Base64UrlBytes

A bytes type that is encoded and decoded using the URL-safe base64 encoder.

from pydantic import Base64UrlBytes, BaseModel

class Model(BaseModel):
    base64url_bytes: Base64UrlBytes

# Initialize the model with base64 data
m = Model(base64url_bytes=b'SHc_dHc-TXc==')
print(m)
#> base64url_bytes=b'Hw?tw>Mw'

Default: Annotated[bytes, EncodedBytes(encoder=Base64UrlEncoder)]

Base64UrlStr

A str type that is encoded and decoded using the URL-safe base64 encoder.

from pydantic import Base64UrlStr, BaseModel

class Model(BaseModel):
    base64url_str: Base64UrlStr

# Initialize the model with base64 data
m = Model(base64url_str='SHc_dHc-TXc==')
print(m)
#> base64url_str='Hw?tw>Mw'

Default: Annotated[str, EncodedStr(encoder=Base64UrlEncoder)]