Typical: Python's Typing Toolkit.
Project description
typical: Python's Typing Toolkit
Introduction
Typical is a library devoted to runtime analysis, inference, validation, and enforcement of Python types, PEP 484 Type Hints, and custom user-defined data-types.
It provides a high-level Functional API and Object API to suite most any occasion.
Getting Started
Installation is as simple as pip install -U typical
. For more
installation options to make typical even faster, see the
Install section in the
documentation.
Help
The latest documentation is hosted at python-typical.org.
Starting with version 2.0, All documentation is hand-crafted markdown & versioned documentation can be found at typical's Git Repo. (Versioned documentation is still in-the-works directly on our domain.)
A Typical Use-Case
The decorator that started it all:
typic.al(...)
import typic @typic.al def hard_math(a: int, b: int, *c: int) -> int: return a + b + sum(c) hard_math(1, "3") #> 4 @typic.al(strict=True) def strict_math(a: int, b: int, *c: int) -> int: return a + b + sum(c) strict_math(1, 2, 3, "4") #> Traceback (most recent call last): #> ... #> typic.constraints.error.ConstraintValueError: Given value <'4'> fails constraints: (type=int, nullable=False, coerce=False)
Typical has both a high-level Object API and high-level Functional API. In general, any method registered to one API is also available to the other.
The Object API
from typing import Iterable import typic @typic.constrained(ge=1) class ID(int): ... @typic.constrained(max_length=280) class Tweet(str): ... @typic.klass class Tweeter: id: ID tweets: Iterable[Tweet] json = '{"id":1,"tweets":["I don\'t understand Twitter"]}' t = Tweeter.transmute(json) print(t) #> Tweeter(id=1, tweets=["I don't understand Twitter"]) print(t.tojson()) #> '{"id":1,"tweets":["I don\'t understand Twitter"]}' Tweeter.validate({"id": 0, "tweets": []}) #> Traceback (most recent call last): #> ... #> typic.constraints.error.ConstraintValueError: Given value <0> fails constraints: (type=int, nullable=False, coerce=False, ge=1)
The Functional API
import dataclasses from typing import Iterable import typic @typic.constrained(ge=1) class ID(int): ... @typic.constrained(max_length=280) class Tweet(str): ... @dataclasses.dataclass # or typing.TypedDict or typing.NamedTuple or annotated class... class Tweeter: id: ID tweets: Iterable[Tweet] json = '{"id":1,"tweets":["I don\'t understand Twitter"]}' protocol = typic.protocol(Tweeter) t = protocol.transmute(json) # or typic.transmute() print(t) #> Tweeter(id=1, tweets=["I don't understand Twitter"]) print(protocol.tojson(t)) #> '{"id":1,"tweets":["I don\'t understand Twitter"]}' protocol.validate({"id": 0, "tweets": []}) # or typic.validate() #> Traceback (most recent call last): #> ... #> typic.constraints.error.ConstraintValueError: Tweeter.id: value <0> fails constraints: (type=int, nullable=False, coerce=False, ge=1)
Changelog
See our Releases.
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.
Filename, size | File type | Python version | Upload date | Hashes |
---|---|---|---|---|
Filename, size typical-2.1.0-py3-none-any.whl (103.3 kB) | File type Wheel | Python version py3 | Upload date | Hashes View |
Filename, size typical-2.1.0.tar.gz (85.7 kB) | File type Source | Python version None | Upload date | Hashes View |