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.11mypy>=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 convertingdataclasses toTypeDicts - ✅
as_typed_dictutility function wrappingdataclasses.asdict - ✅ Support for usage with
TypeVars - ✅ Nested dataclasses
- ✅ Compatibility with other typecheckers such as
PylanceandPyright - ✅ 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.1.tar.gz
(5.5 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ubertyped-0.1.1.tar.gz.
File metadata
- Download URL: ubertyped-0.1.1.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa5c4af766a4c71635479ec10b68bdc3d8c350702a267bea754fa5c5e6a739c9
|
|
| MD5 |
fd8c3c876dbcf9f8cbd4da3f630f6b34
|
|
| BLAKE2b-256 |
82f0a8050c02dbcb024b78a146d6e5ce8cc4e15b014342253f4ec58135367e8e
|
File details
Details for the file ubertyped-0.1.1-py3-none-any.whl.
File metadata
- Download URL: ubertyped-0.1.1-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1db99319edd6ff12fcaf3a6986cd7d8fbf3f3cf29d031207bee26beabf6cb54f
|
|
| MD5 |
ac9b1ae6d981419ffd9a8f03fa258d63
|
|
| BLAKE2b-256 |
0fd797960a3b0cd5b2afc92f2033046f81c293b9b2a09c01501d74479ed6030a
|