Skip to main content

Dependent types for Python

Project description

dependent-types

Dependent types for Python.

Installation

python3 -m pip install dependent-types

Abstract

  • Make illegal states unrepresentable.
  • Parse, don't validate
  • Abuse __instancecheck__ and type-guards.
  • Values are checked at runtime but no extra instances/subclasses are instantiated.

Usage

Builtin types

dept.datetime

  • TZAware
  • TZNaive

dept.numeric

  • Natural
  • NegativeInt
  • Portion

dept.re

  • Match

dept.sized

  • NonEmpty
  • Empty

Creating dependent types

To create new dependent types, subclass dept.base.Dependent and define an __instancecheck__ method:

from typing import Any
from typing import TYPE_CHECKING

from dept.base import Dependent


class Greeting(str, Dependent):
    @classmethod
    def __instancecheck__(cls, instance: Any) -> bool:
        return (
            isinstance(instance, str)
            and instance.startswith(("Hello", "Hi"))
        )


hello = "Hello there"
# We can narrow types using mypy's type guards
assert isinstance(hello, Greeting)
# or explicitly when we need to
hi = Greeting.from_instance("Hi there")

# The runtime types are unchanged and will still be str for our greetings
assert type(hello) is str
assert type(hi) is str

# But their static types will be Greeting, retaining the information that our
# strings are not just any strs
if TYPE_CHECKING:
    reveal_type(hello)
    reveal_type(hi)

# As this string doesn't fulfill our __instancecheck__, it will not be an
# instance of Greeting.
assert not isinstance("Goodbye", Greeting)

Checkout out the dacite example for how to create dataclasses with rich dependently typed fields without duplicating type definitions or losing parsed information.

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

dependent-types-0.0.1.tar.gz (6.5 kB view details)

Uploaded Source

Built Distribution

dependent_types-0.0.1-py3-none-any.whl (8.6 kB view details)

Uploaded Python 3

File details

Details for the file dependent-types-0.0.1.tar.gz.

File metadata

  • Download URL: dependent-types-0.0.1.tar.gz
  • Upload date:
  • Size: 6.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.1.3 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.8.1

File hashes

Hashes for dependent-types-0.0.1.tar.gz
Algorithm Hash digest
SHA256 9809734e55e8728c82bc22aaeac81120e60f989fe3ccd0e3f55fdd5890f85724
MD5 c7342238accd06cf80313a6dc5114e4d
BLAKE2b-256 56362e3d6ec024e0e19f79b3d5bde84f6c2708946153b409413f197f8d9d934a

See more details on using hashes here.

File details

Details for the file dependent_types-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: dependent_types-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 8.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.1.3 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.8.1

File hashes

Hashes for dependent_types-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 63d65448486f8ca8fdc7b568fa69996be77549881cfc3f64f89b6cdd58e071ea
MD5 808f8df5fe52f672a2269185915eaac7
BLAKE2b-256 facce3c37551815b077a20ed43c7a5fae9956e989a5c6d2a10c31f0faafb4458

See more details on using hashes here.

Supported by

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