Skip to main content

Convert dataclass to TypedDict for fun and (type) safety 🪄

Project description

Übertyped

Convert dataclass to TypedDict for fun and (type) safety 🪄

uber- /ˈuːbə/ to a great or extreme degree

Requirements

  • python>=3.11
  • mypy>=1.0.1

Installation

pip install ubertyped

Mypy plugin

Add ubertyped.mypy_plugin to the list of plugins in your mypy config file (for example pyproject.toml)

[tool.mypy]
python_version = "3.11"
plugins = ["ubertyped.mypy_plugin"]

Features

  • AsTypedDict[T] generic type converting dataclasses to TypeDicts
  • as_typed_dict utility function wrapping dataclasses.asdict
  • ✅ Support for usage with TypeVars
  • ✅ Nested dataclasses
  • ✅ Compatibility with other typecheckers such as Pylance and Pyright
  • ✅ Zero dependencies

Usage

from dataclasses import asdict, dataclass
from typing import Self, reveal_type

from ubertyped import AsTypedDict, as_typed_dict


@dataclass
class Base:
    base: bool


@dataclass
class IntWraper:
    value: int


@dataclass
class Data(Base):
    version: IntWraper
    command: str

    def as_typed_dict(self) -> AsTypedDict[Self]:
        return as_typed_dict(self)


data = Data(version=IntWraper(1), command="c", base=False)

# 🎉 Type-safe conversion!
td = as_typed_dict(data)
reveal_type(td)
# Revealed type is "TypedDict({'version': TypedDict({'value': builtins.int}), 'command': builtins.str, 'base': builtins.bool})"

# 🎉 Works with nested dataclasses too!
reveal_type(td["version"]["value"])
# Revealed type is "builtins.int"


# 🎉 Binding `Self` in methods is resolved correctly!
reveal_type(data.as_typed_dict)
# Revealed type is "def () -> TypedDict({'version': TypedDict({'value': builtins.int}), 'command': builtins.str, 'base': builtins.bool})"

# 🎉 In runtime, `as_typed_dict` is just a wrapper around `asdict`!
if asdict(data) == data.as_typed_dict():
    print("✅")
else:
    print("❌")

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ubertyped-0.0.2.tar.gz (5.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ubertyped-0.0.2-py3-none-any.whl (5.1 kB view details)

Uploaded Python 3

File details

Details for the file ubertyped-0.0.2.tar.gz.

File metadata

  • Download URL: ubertyped-0.0.2.tar.gz
  • Upload date:
  • Size: 5.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.0 CPython/3.12.0 Darwin/23.1.0

File hashes

Hashes for ubertyped-0.0.2.tar.gz
Algorithm Hash digest
SHA256 77b742b2e83794f4f5d535b2fc0a783572a0fe50afd46f54149697d5b68d77eb
MD5 cf14b333b90d3d6c86cccec2a6c53448
BLAKE2b-256 078df2fe1393b4cab355e4303c53710fe096df5f0067918988c69cf0d87fd9f4

See more details on using hashes here.

File details

Details for the file ubertyped-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: ubertyped-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 5.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.0 CPython/3.12.0 Darwin/23.1.0

File hashes

Hashes for ubertyped-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5dccdbbde2b698b3407876d41087d3961e32e0b69e709ab01d0fd8a38beae5ba
MD5 da353536a8e504411b9ac73121212c04
BLAKE2b-256 b320493ef80dd260024e094f3a1c6908ccf7661cc53604d719eb035a555bbf6d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page