Skip to main content

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


Download files

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

Source Distribution

choicetypes-0.1.0rc1.tar.gz (4.9 kB view details)

Uploaded Source

Built Distribution

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

choicetypes-0.1.0rc1-py3-none-any.whl (5.0 kB view details)

Uploaded Python 3

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

Hashes for choicetypes-0.1.0rc1.tar.gz
Algorithm Hash digest
SHA256 7102e1c3fd93f1ea7bd4e0c1d8dc89af9aeb05f5dadedbb565263a44e603dbb5
MD5 adde7ee0c3692af110733936488f90b3
BLAKE2b-256 1f0b12a4bcc974364be7e5a42d4e2495c9651a5980db32fa598d93c85790a71a

See more details on using hashes here.

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

Hashes for choicetypes-0.1.0rc1-py3-none-any.whl
Algorithm Hash digest
SHA256 33201af622da8426416728b51b8e3dd10cee08a697a6a930c52f7c320e8fed4e
MD5 d2a45f34ac03fea9ca62ad196e445a53
BLAKE2b-256 7027bf3bb32653591a7fa39720b721488a015c746e33a4d539ec49892dbd4f5c

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