Peritype
Peritype helps you navigate Python types and annotations at runtime with ease.
It provides a standard interface to inspect the mess of types, generics, TypeVars, Annotateds, and more.
Installation
$ pip install peritype # or use your preferred package manager
Features
Simple type wrapping
from peritype import wrap_type
class MyClass:
attr: int
def __init__(self, x: int, y: str) -> None:
self.x = x
self.y = y
def my_method(self, z: float) -> bool:
return z > 0.0
wrapped = wrap_type(MyClass)
# Test if the type can match another type
assert wrapped.match(MyClass)
assert not wrapped.match(int)
# Access attribute type hints
hints = wrapped.attribute_hints
assert hints['attr'].match(int)
# Access the __init__ method's signature hints
init_signature = wrapped.init.get_signature_hints()
assert init_signature['x'].match(int)
assert init_signature['y'].match(str)
# Access method signatures
method_wrap = wrapped.get_method_hints('my_method')
method_signature = method_wrap.get_signature_hints()
assert method_signature['z'].match(float)
assert method_wrap.return_hint.match(bool)
Generic type wrapping
from peritype import wrap_type
class GenericParent[T]:
def get_value(self) -> T:
...
class GenericChild[T, U](GenericParent[U]):
def get_other_value(self) -> T:
...
wrapped_child = wrap_type(GenericChild[int, str])
# Access method signatures with resolved generics
get_value_wrap = wrapped_child.get_method_hints('get_value')
get_value_signature = get_value_wrap.get_signature_hints()
assert get_value_wrap.get_return_hint().match(str)
get_other_value_wrap = wrapped_child.get_method_hints('get_other_value')
get_other_value_signature = get_other_value_wrap.get_signature_hints()
assert get_other_value_wrap.get_return_hint().match(int)
Union and Any handling
from peritype import wrap_type
int_wrap = wrap_type(int)
# A simple type can match itself and unions including itself
assert int_wrap.match(int)
assert int_wrap.match(int | str)
assert not int_wrap.match(str)
union_wrap = wrap_type(int | str)
# A union type can match any of its member types and unions including them
assert union_wrap.match(int | str)
assert union_wrap.match(int)
assert union_wrap.match(str)
assert union_wrap.match(int | float)
assert not union_wrap.match(float)
int_list_wrap = wrap_type(list[int])
# A generic type with parameters can match the same generic with compatible parameters, including Any or Ellipsis
assert int_list_wrap.match(list[int])
assert int_list_wrap.match(list[int | str])
assert int_list_wrap.match(list[Any])
Type metadata, Annotated and more
from peritype import wrap_type
from typing import Annotated, NotRequired, TypedDict
annotated_wrap = wrap_type(Annotated[int | None, "metadata"])
assert annotated_wrap.nullable # None in the union
assert not annotated_wrap.union # int | None is not considered a union, the None part is handled separately
assert annotated_wrap.annotations == ("metadata",)
class MyTypedDict(TypedDict, total=False):
x: int
y: NotRequired[str]
typed_dict_wrap = wrap_type(MyTypedDict)
assert not typed_dict_wrap.total
attrs = typed_dict_wrap.attribute_hints
assert attrs["x"].match(int)
assert attrs["y"].match(str)
assert attrs["x"].required
assert not attrs["y"].required
Function wrapping
from peritype import wrap_func
def my_function(a: int, b: str) -> bool:
return str(a) == b
wrapped_func = wrap_func(my_function)
# Access function signature hints
signature_hints = wrapped_func.get_signature_hints()
assert signature_hints['a'].match(int)
assert signature_hints['b'].match(str)
assert wrapped_func.get_return_hint().match(bool)
Metadata
Release files for peritype 0.6.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| peritype-0.6.2.tar.gz | 11.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| peritype-0.6.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 27.4 kB
Release files / peritype-0.6.2.tar.gz
| Download URL | peritype-0.6.2.tar.gz |
|---|---|
| Size | 11.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a0ef2b9c26444078fa21f34337411811b0d2fd3b83779d8348c4ec452815d533
|
|
BLAKE2b-256 checksum How to use checksums |
c3d130c148c333346fa7db9a51b5f8abb6898cf3350c7688b1ffc7ab463bd7bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / peritype-0.6.2-py3-none-any.whl
| Download URL | peritype-0.6.2-py3-none-any.whl |
|---|---|
| Size | 16.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c933e4c6c107e8f1124280db5a0c5a09e10b92f6d3f26bcf429fbff7411dbe01
|
|
BLAKE2b-256 checksum How to use checksums |
addf58f59a7f6d42facb1cc1f0c009cbda5598f21d1a449775813203cda900c5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|