Skip to main content

pydantypes

CI license PyPI Downloads Pydantic v2 Ruff types tests

The missing types for Pydantic — cloud, DevOps, web, data, and AI engineering.

pydantypes provides validated, constrained Pydantic types for identifiers, ARNs, URIs, resource names, and classification labels that appear everywhere in modern infrastructure and AI code. Catch invalid values at parse time, not at deploy time.

Installation

pip install pydantypes
# or
uv add pydantypes

Quick Example

Every type validates and parses — you get structured properties, not just accept/reject.

from pydantic import BaseModel
from pydantypes.cloud.aws import S3Uri, IamRoleArn

class PipelineConfig(BaseModel):
    source: S3Uri
    execution_role: IamRoleArn

config = PipelineConfig(
    source="s3://my-bucket/data/input.parquet",
    execution_role="arn:aws:iam::123456789012:role/pipeline-role",
)
config.source.bucket             # "my-bucket"
config.source.key                # "data/input.parquet"
config.execution_role.role_name  # "pipeline-role"

Domains

Domain Package What You Get
AWS pydantypes.cloud.aws S3 URIs, IAM ARNs, Lambda names, EC2/ECS/EKS IDs, account IDs, regions
Azure pydantypes.cloud.azure Blob Storage URIs, resource IDs, Key Vault names, subscription IDs
GCP pydantypes.cloud.gcp GCS URIs, project IDs, service account emails, Cloud Run services
DevOps pydantypes.devops Docker image refs, Git SHAs/refs/URLs, K8s names/labels, Helm charts, Terraform addresses
Web pydantypes.web Hosts, URNs, slugs, JWTs, MIME types, FQDNs, port ranges, Bearer tokens, hashes
Data pydantypes.data SQL identifiers, Kafka topics, connection strings, column names
AI pydantypes.ai Classification labels with lifecycle, deprecation, alias resolution

Types You Won't Find Anywhere Else

Parse cloud resources into structured components

from pydantypes.cloud.aws import Arn
from pydantypes.cloud.azure import ResourceId

arn = Arn("arn:aws:iam::123456789012:role/pipeline-role")
arn.service      # "iam"
arn.account_id   # "123456789012"
arn.resource     # "role/pipeline-role"

rid = ResourceId(
    "/subscriptions/12345678-1234-1234-1234-123456789012"
    "/resourceGroups/myRG/providers/Microsoft.Compute/virtualMachines/myVM"
)
rid.subscription_id     # "12345678-1234-1234-1234-123456789012"
rid.resource_group      # "myRG"
rid.provider_namespace  # "Microsoft.Compute"
rid.resource_type       # "virtualMachines"
rid.resource_name       # "myVM"

Decompose Docker refs and Git URLs

from pydantypes.devops import DockerImageRef, GitSshUrl

img = DockerImageRef("ghcr.io/owner/app:v2.1@sha256:abcdef1234567890")
img.registry    # "ghcr.io"
img.repository  # "owner/app"
img.tag         # "v2.1"
img.digest      # "sha256:abcdef1234567890"

url = GitSshUrl("git@github.com:torvalds/linux.git")
url.host   # "github.com"
url.owner  # "torvalds"
url.repo   # "linux"

Validate web identifiers with RFC-compliant parsing

from pydantypes.web import Host, Urn, Jwt, MimeType

host = Host("[2001:db8::1]")
host.host_type  # "ipv6"

host = Host("api.example.com")
host.host_type  # "domain"

urn = Urn("urn:isbn:0451450523")
urn.nid  # "isbn"
urn.nss  # "0451450523"

jwt = Jwt("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NSJ9.signature")
jwt.header   # {"alg": "HS256"}
jwt.payload  # {"sub": "12345"}

mime = MimeType("application/json;charset=utf-8")
mime.type        # "application"
mime.subtype     # "json"
mime.parameters  # {"charset": "utf-8"}

Manage classification label lifecycles

Nothing like this exists in the Pydantic ecosystem. LabelEnum gives you typed classification labels for LLM and ML projects — with descriptions, deprecation warnings, retirement enforcement, and alias resolution built in. Compatible with OpenAI structured outputs, LangChain with_structured_output, and all Pydantic-based LLM frameworks.

from pydantic import BaseModel
from pydantypes.ai import LabelEnum, Label

class Sentiment(LabelEnum):
    POSITIVE = Label("positive", description="Expresses approval or satisfaction")
    NEGATIVE = Label("negative", description="Expresses disapproval or frustration")
    NEUTRAL  = Label("neutral",  description="No clear emotional signal")

    # Taxonomy evolves — deprecate old labels without breaking existing data
    MIXED = Label(
        "mixed",
        deprecated=True,
        successor="NEUTRAL",
        description="Contradictory signals",
    )

    # Retired labels are rejected outright, but aliases still resolve
    AMBIGUOUS = Label(
        "ambiguous",
        retired=True,
        successor="NEUTRAL",
        aliases=["unclear", "unknown"],
    )

class Result(BaseModel):
    sentiment: Sentiment

# Active labels work normally
result = Result(sentiment="positive")
result.sentiment.description  # "Expresses approval or satisfaction"

# Deprecated labels still parse but emit a DeprecationWarning
result = Result(sentiment="mixed")  # warns: "Label 'mixed' is deprecated. Use 'NEUTRAL' instead."

# Retired labels are rejected — forces migration
Result(sentiment="ambiguous")  # -> ValidationError

# Aliases silently resolve to their target
result = Result(sentiment="unclear")  # resolves to AMBIGUOUS's alias -> handled

In any classification project, your label taxonomy will change. Labels get merged, split, renamed. Without lifecycle management you end up with dead labels in your schema, silent data quality regressions, and no migration path. LabelEnum makes taxonomy evolution a first-class concern.

# Introspect your taxonomy programmatically
Sentiment.active_labels()      # [POSITIVE, NEGATIVE, NEUTRAL]
Sentiment.deprecated_labels()  # [MIXED]
Sentiment.retired_labels()     # [AMBIGUOUS]
Sentiment.schema_values()      # ["positive", "negative", "neutral", "mixed"] (excludes retired)
Sentiment.alias_map()          # {"unclear": AMBIGUOUS, "unknown": AMBIGUOUS}

Compatibility

pydantypes is designed as a complement to pydantic-extra-types. While pydantic-extra-types covers general-purpose types (colors, phone numbers, payment cards), pydantypes focuses on infrastructure and engineering identifiers.

For IBAN and BIC (banking identifiers), use schwifty which provides native Pydantic v2 support with __get_pydantic_core_schema__.

  • Requires Pydantic v2.5+
  • Supports Python 3.10–3.13

Architecture

See ARCHITECTURE.md for type patterns, conventions, and design decisions.

Development

# Clone and set up
git clone https://github.com/oborchers/pydantypes.git
cd pydantypes
make init

# Run checks
make check        # lint + typecheck + test
make format       # auto-format code
make test-cov     # tests with coverage report

Disclaimer

pydantypes is an independent, community-maintained package and is not affiliated with or endorsed by Pydantic Services Inc.

Author

Built by Dr. Oliver Borchers, Executive AI and Automation Partner and Head of AI Engineering at IU Group.

License

MIT

Metadata

Release files for pydantypes 1.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pydantypes 1.1.1
File Size Uploaded Provenance Actions
pydantypes-1.1.1.tar.gz 171.9 kB With provenance Details for pydantypes-1.1.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pydantypes 1.1.1
File Interpreter ABI Platform Actions
pydantypes-1.1.1-py3-none-any.whl Python 3 none any Details for pydantypes-1.1.1-py3-none-any.whl

Total release size: 235.4 kB

Release files / pydantypes-1.1.1.tar.gz

Download URL pydantypes-1.1.1.tar.gz
Size 171.9 kB
Tags Source
SHA-256 checksum
How to use checksums
e715ceebbff70c4b7521afc223a9ade0e7397ed8985499ceecd6125d44f4a66b
BLAKE2b-256 checksum
How to use checksums
7b088bc931783218447ee3b202619bd701dce0f1772ed21b0b0a044f5d4f9157
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.

Transparency log

Release files / pydantypes-1.1.1-py3-none-any.whl

Download URL pydantypes-1.1.1-py3-none-any.whl
Size 63.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
28c7dd3b5788cc1440fad2f790015846b82b1b186c8ebcb453af31f1bd7d412d
BLAKE2b-256 checksum
How to use checksums
35bdf6fa06ede97bb56e83e6be695b71b755957e0d75d886c62478e9d8b88c1c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.

Transparency log

Security for pydantypes 1.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for pydantypes-1.1.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page