Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

disdantic Logo

The missing polymorphic engine for Pydantic.

GitHub Release PyPI Release Supported Python Versions
CI Status
Open Issues License

Documentation | Roadmap | Issues | Discussions


Overview

disdantic is a lightweight Python toolkit designed to simplify Pydantic subclass registries, dynamic polymorphic unions, and automatic model discovery. By eliminating the manual boilerplate of maintaining union types and tracking child class imports, it allows you to build clean, extensible, and self-updating polymorphic domain models.

Why Use disdantic?

  • Decoupled Registries: Fully isolated subclass tracking namespaces prevent collisions between distinct model domains.
  • Dynamic Tagged Unions: Automatic core schema generation dynamically routes incoming JSON payload validation based on a customizable discriminator key.
  • Topological Schema Rebuilding: Dynamic subclass registrations trigger cascade schema reloading up the dependent parent MRO trees.
  • Automatic Discovery & Auto-Import: Traverses folders recursively to discover and import submodules, ensuring subclasses register themselves without manual imports.
  • Robust Object Introspection: Extracts slots, properties, and attributes into sanitized primitives, handling circular references and lazy loader proxies safely.
  • CLI Diagnostics Suite: Scans, lists, validates compilation integrity, and exports schemas.

Comparisons

Feature Pure Pydantic v2 Pydantic + disdantic
Union Type Definitions Manual list (e.g., Union[A, B, C]) Automatic tagged union via registry base class
New Subclass Adding Modify parent union type and import Register via decorator; schema cascades automatically
Dynamic Import Scanning Manual importlib boilerplate Declarative packages scan via AutoImporterMixin
Integrity Auditing Manual script validation Programmatic and CLI-based diagnostics
Schema Generation model_json_schema() on static types Command-line extraction via disdantic schema

Quick Start

Installation

pip install disdantic

For advanced features like YAML serialization, install the optional package extra:

pip install disdantic[yaml]

Core Usage Example

from typing import Literal
from disdantic import PydanticClassRegistryMixin
from pydantic import BaseModel

# 1. Define a polymorphic base registry class
class Message(PydanticClassRegistryMixin):
    schema_discriminator = "msg_type"  # Custom tag field name
    msg_type: str

# 2. Register subclass implementations dynamically
@Message.register("text")
class TextMessage(Message):
    msg_type: Literal["text"] = "text"
    content: str

@Message.register("image")
class ImageMessage(Message):
    msg_type: Literal["image"] = "image"
    url: str
    caption: str | None = None

# 3. Parents automatically rebuild to accommodate new subtypes
class ChatRoom(BaseModel):
    room_name: str
    messages: list[Message]  # Polymorphic union field

# 4. Incoming payloads validate dynamically to correct subclass types
payload = {
    "room_name": "General Chat",
    "messages": [
        {"msg_type": "text", "content": "Hello world!"},
        {"msg_type": "image", "url": "https://placehold.co/150.png", "caption": "Logo"}
    ]
}

room = ChatRoom.model_validate(payload)
assert isinstance(room.messages[0], TextMessage)
assert isinstance(room.messages[1], ImageMessage)

# 5. Full marshalling flow (serialization and deserialization)
room_data = room.model_dump()
# msg_type is automatically included in the serialized output!
assert room_data["messages"][0]["msg_type"] == "text"
assert room_data["messages"][1]["msg_type"] == "image"

restored_room = ChatRoom.model_validate(room_data)
assert isinstance(restored_room.messages[0], TextMessage)
assert isinstance(restored_room.messages[1], ImageMessage)

Component Architecture

  • src/disdantic/: Library package containing runtime implementations.
    • registry.py: Core RegistryMixin, PydanticClassRegistryMixin, and global RegistryManager.
    • model.py: Abstract ReloadableBaseModel enabling topological cascading rebuilds.
    • diagnose.py: Registry integrity check orchestrator and compile validation check.
    • introspection.py: Recursively maps complex objects to primitives via InfoMixin.
    • loading.py: Thread-safe deferred instantiation with LazyLoader and LazyProxy.
    • settings.py: Centralized Settings utilizing Pydantic Settings.
  • tests/: Multi-tiered testing suite (python/unit/, python/integration/, and e2e/).
  • docs/: Markdown files compiled using Zensical static site generator.
  • examples/: Self-contained runnable scripts demonstrating configurations.

Advanced Usage & Documentation

For detailed information on configuration settings, custom handlers, CLI commands, and operational guides, visit the Documentation Site.

Contributing

We welcome contributions! Please see CONTRIBUTING.md for guidelines and DEVELOPING.md for development setup instructions.

Ensure you adhere to our Code of Conduct in all community interactions.

Support & Security

License

Licensed under the Apache License 2.0. See the LICENSE file for details.

Citations

If you use this repository or the resulting software in your research, please cite it using the following BibTeX entry:

@software{disdantic,
  author = {markurtz},
  title = {disdantic},
  year = 2026,
  url = {https://github.com/markurtz/disdantic}
}

Metadata

Release files for disdantic 0.2.0a20260613

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

Source distribution (sdist)

Source distribution for disdantic 0.2.0a20260613
File Size Uploaded
disdantic-0.2.0a20260613.tar.gz 604.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for disdantic 0.2.0a20260613
File Interpreter ABI Platform
disdantic-0.2.0a20260613-py3-none-any.whl Python 3 none any Details

Total release size: 657.4 kB

Release files / disdantic-0.2.0a20260613.tar.gz

Download URL disdantic-0.2.0a20260613.tar.gz
Size 604.5 kB
Tags Source
SHA-256 checksum
How to use checksums
4bf355f987deb84a17e5146ed8bb2b4ad209c71fba8576bd8d1b82b3b98be331
BLAKE2b-256 checksum
How to use checksums
811c0ea8c7911d0b735abb2bbf8fb249feff0af26bf25c38fbcf0d84f8277ff9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

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 Jun 14, 2026.

Transparency log

Release files / disdantic-0.2.0a20260613-py3-none-any.whl

Download URL disdantic-0.2.0a20260613-py3-none-any.whl
Size 52.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
750ea3d349d2f8c31bc7e0e4c49e4631e8c9bc6e90c947289cc0fc55ee2bb6c3
BLAKE2b-256 checksum
How to use checksums
aa35e3e01eace152b94785066e76b15b6c4b5032c7590fa9f10fc70acfee7c68
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

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 Jun 14, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0a20260613 This release

2 release files

0.1.0

2 release files

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