Powerful and simple algebraic sum types in Python.
Project description
Python Choice Types
choicetypes brings powerful and simple algebraic sum types to Python.
Usage
New Choice types are constructed using sytax similar to standard library enums and dataclasses:
from choicetypes import Choice
class IpAddr(Choice):
V4: tuple[int, int, int, int]
V6: str
home = IpAddr(V4=(127, 0, 0, 1))
loopback = IpAddr(V6="::1")
A choice consists of mutually exclusive variants. In this example, any instance of IpAddr must be either a V4 or V6 address. Variants are just normal attributes and can be accessed as such. But they're also designed to work seamlessly with structural pattern matching, introduced in Python 3.10:
for ip in (home, loopback):
match ip:
case IpAddr(V4=fields):
print("{}:{}:{}:{}".format(*fields))
case IpAddr(V6=text):
print(text)
For a complete overview of what Choice type can do, see the official documentation.
Installation
The choicetypes package is available on PyPi:
pip install choicetypes
It is written in pure Python with zero dependencies and tested against Python 3.7 and newer.
Background
Algebraic choice types have various other names (sum types, tagged unions, etc.) and exist in a number of programming languages. The primary inspiration for choicetypes was Rust's Enum type.
Python's Enum allows you to express mutually exclusive variants, but not associated data. Its dataclass (and similar) types store data but cannot represent mutually exclusive variants. The core idea behind algebraic sum types is to store these two pieces of information simultaneously.
I wanted to build a type that could accomplish this in a similar style to Rust. Importantly, it had to work cleanly with structural pattern matching and type hinting.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
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 choicetypes-0.1.0rc1.tar.gz.
File metadata
- Download URL: choicetypes-0.1.0rc1.tar.gz
- Upload date:
- Size: 4.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.2.0 CPython/3.10.6 Darwin/21.6.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7102e1c3fd93f1ea7bd4e0c1d8dc89af9aeb05f5dadedbb565263a44e603dbb5
|
|
| MD5 |
adde7ee0c3692af110733936488f90b3
|
|
| BLAKE2b-256 |
1f0b12a4bcc974364be7e5a42d4e2495c9651a5980db32fa598d93c85790a71a
|
File details
Details for the file choicetypes-0.1.0rc1-py3-none-any.whl.
File metadata
- Download URL: choicetypes-0.1.0rc1-py3-none-any.whl
- Upload date:
- Size: 5.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.2.0 CPython/3.10.6 Darwin/21.6.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
33201af622da8426416728b51b8e3dd10cee08a697a6a930c52f7c320e8fed4e
|
|
| MD5 |
d2a45f34ac03fea9ca62ad196e445a53
|
|
| BLAKE2b-256 |
7027bf3bb32653591a7fa39720b721488a015c746e33a4d539ec49892dbd4f5c
|