Extend typing package functionalities
Project description
typingx
typing
is great but it changed a lot since 3.6 and it's not over!
This library purpose is to have a consistent behaviour for all those versions to mimic the most recent one
and go even further with typing
(and typing_extensions
).
It provides:
get_args
andget_origin
for python3.6
to3.9
that mimic3.10
behaviouris_literal
,is_typeddict
helpers- most
typing
types but with homogeneous behaviour (e.g. with3.8
,typing.TypedDict
won't store information to distinguish optional and required keys. This lib will hence choosetyping_extensions
version)
but also:
isinstancex
: likeisinstance
but withtyping(x)
types- extra types:
Listx
andTuplex
: more sophisticated versions ofList
andTuple
to add...
anywhere in the parameters
- extanded types:
TypedDict
has a__extra__
field (value can be changed) to allow type checking on optional fields
Installation
pip install typingx
Usage
from collections import ChainMap, Counter
from typingx import (
Any,
Dict,
List,
Listx,
Literal,
Mapping,
Sequence,
Set,
Tuple,
Tuplex,
Type,
TypedDict,
Union,
isinstancex,
)
# Dict
assert isinstancex({"a": 1, "b": 2}, Dict[str, int]) is True
assert isinstancex({"a": 1, "b": 2}, Dict[str, str]) is False
assert isinstancex({"a": 1, "b": 2}, Dict[int, str]) is False
assert isinstancex({"a": 1, "b": 2}, Dict[str, Any]) is True
# List
assert isinstancex([1, 2, 3], List[int]) is True
assert isinstancex([1, 2, "q"], List[int]) is False
assert isinstancex([1, 2, "q"], List[Union[str, int]]) is True
# Listx
assert isinstancex([1, 2, 3, 4], Listx[int]) is True
assert isinstancex([1, 2, "q"], Listx[int, ..., str]) is True
assert isinstancex([1, 2, "q", "w", "e"], Listx[int, ..., str]) is False
assert isinstancex([1, 2, "q", "w", "e"], Listx[int, ..., str, ...]) is True
assert isinstancex([1, 2, "q", "w", b"xyz", "e"], Listx[int, ..., str, ...]) is False
assert isinstancex([1, 2, "q", "w", b"xyz", "e"], Listx[int, ..., Union[str, bytes], ...]) is True
# Literal
assert isinstancex("a", Literal["a"]) is True
assert isinstancex(Literal["a"], Literal["a"]) is True
assert isinstancex("b", Literal["a"]) is False
assert isinstancex("b", Literal["a", Literal[Literal["b"]]]) is True
assert isinstancex(Literal["a", "b"], Literal["b", "a", "c"]) is True
# Mapping
assert isinstancex(Counter({"red": 4, "blue": 2}), Mapping[str, int]) is True
assert isinstancex(ChainMap({"art": "van gogh"}, {"music": "bach"}), Mapping[str, str]) is True
# Sequence
assert isinstancex("abc", Sequence[Any]) is True
assert isinstancex("abc", Sequence[int]) is False
assert isinstancex((1, 3, 5), Sequence[int]) is True
# Set
assert isinstancex({"a", "b"}, Set[str]) is True
assert isinstancex({"a", "b"}, Set[int]) is False
# Tuple
assert isinstancex((1, 2), Tuple[int, ...]) is True
assert isinstancex((1, 2), Tuple[int, int]) is True
assert isinstancex((1, 2), Tuple[int, int, int]) is False
# Tuplex
assert isinstancex((3, "a", "b"), Tuplex[int, str, ...]) is True
assert isinstancex((3, "a", "b", "c"), Tuplex[int, str, ...]) is True
assert isinstancex((3, "a", "b", "c"), Tuplex[int, str, ..., bool]) is False
assert isinstancex((3, "a", "b", "c", True), Tuplex[int, str, ..., bool]) is True
assert isinstancex((3, "a", "b", "c", 3), Tuplex[int, str, ..., bool]) is False
assert isinstancex((3, "a", "b", "c", True, False), Tuplex[int, str, ..., bool, ...]) is True
# Type
class User: ...
class BaseUser(User): ...
assert isinstancex(BaseUser, Type[BaseUser]) is True
assert isinstancex(BaseUser, Type[User]) is True
assert isinstancex(User, Type[User]) is True
assert isinstancex(User, Type[BaseUser]) is False
# TypedDict
FullMovie = TypedDict("FullMovie", {"name": str, "year": int})
class PartialMovie(TypedDict, total=False):
name: str
year: int
class ExtraMovie(TypedDict):
name: str
year: int
__extra__: str
assert isinstancex({"name": "The Matrix", "year": 1999}, FullMovie) is True
assert isinstancex({"name": "The Matrix", "year": "1999"}, FullMovie) is False
assert isinstancex({"name": "The Matrix"}, FullMovie) is False
assert isinstancex({"name": "The Matrix", "year": 1999, "extra": "qwe"}, FullMovie) is False
assert isinstancex({"name": "The Matrix", "year": 1999}, PartialMovie) is True
assert isinstancex({"name": "The Matrix"}, PartialMovie) is True
assert isinstancex({"name": "The Matrix", "year": 1999, "extra": "qwe"}, PartialMovie) is False
assert isinstancex({"name": "The Matrix", "year": 1999}, ExtraMovie) is True
assert isinstancex({"name": "The Matrix", "year": 1999, "q": "w", "e": "r"}, ExtraMovie) is True
assert isinstancex({"name": "The Matrix", "year": 1999, "q": "w", "e": 1}, ExtraMovie) is False
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
typingx-0.2.1.tar.gz
(8.7 kB
view details)
Built Distribution
File details
Details for the file typingx-0.2.1.tar.gz
.
File metadata
- Download URL: typingx-0.2.1.tar.gz
- Upload date:
- Size: 8.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.0.5 CPython/3.8.2 Darwin/18.7.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3c27f4bf6f2ca27be643ee3d596ecb525c57c1ff1dd1c3455870684b9a4f9b51 |
|
MD5 | 328311dde5e702d8203ecebc5748262d |
|
BLAKE2b-256 | 81d95d5ac8f922a05b4cf3f9af60e090aab29078fca0d3765cedbc841501d6fc |
File details
Details for the file typingx-0.2.1-py3-none-any.whl
.
File metadata
- Download URL: typingx-0.2.1-py3-none-any.whl
- Upload date:
- Size: 7.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.0.5 CPython/3.8.2 Darwin/18.7.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f2fb78cdb5fa9d547a339b5d1efe4aeec56bcbffa9c3ff72905a0654f10e11bd |
|
MD5 | 985f348fd022a4ce3fa3661912a8ee9c |
|
BLAKE2b-256 | 2374c2bef2324ddf21068bafda4e5e306983807bdfc609f56bf0da4066669ed2 |