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 IntWrapper:
    value: int


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

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


data = Data(version=IntWrapper(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.1.2.tar.gz (5.5 kB view details)

Uploaded Source

Built Distribution

ubertyped-0.1.2-py3-none-any.whl (5.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: ubertyped-0.1.2.tar.gz
  • Upload date:
  • Size: 5.5 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.1.2.tar.gz
Algorithm Hash digest
SHA256 a50e8e317764e926b530f2c16fb2335e8b92c519b90744f7258e831e1ab5fec8
MD5 fec30924dc18405d9f6603b3445134f0
BLAKE2b-256 0f48180c1e064ec52519ecba0072b20daa8bcb3d4f6686993472e9bab52a2a6f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ubertyped-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 5.2 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.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ea32a652e971498c83cafd3b7e09c16c675d5a72e6ad30c1b1f4b7ded13badaa
MD5 7d833a2ec12d395ce1b3144e8dabc8e9
BLAKE2b-256 92ae799ddeb9497b1a390568ba32900032615732634624aaac26282031a696b5

See more details on using hashes here.

Supported by

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