Peritype helps you explore Python types at runtime with ease.
Project description
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)
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
peritype-0.1.2.tar.gz
(7.7 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
peritype-0.1.2-py3-none-any.whl
(11.5 kB
view details)
File details
Details for the file peritype-0.1.2.tar.gz.
File metadata
- Download URL: peritype-0.1.2.tar.gz
- Upload date:
- Size: 7.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fba069388d10cd1ae77b6c350534fd621e108451f1b559fe07404df0d2ff84c0
|
|
| MD5 |
a089d14a06a9f83f1f06af5513e7bee6
|
|
| BLAKE2b-256 |
41f2bb32e383d2b101ca980a1b07eb00f2c4ba6277c3ce6a252130f091b5656a
|
File details
Details for the file peritype-0.1.2-py3-none-any.whl.
File metadata
- Download URL: peritype-0.1.2-py3-none-any.whl
- Upload date:
- Size: 11.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ed513d896c56e58172cf10871da3199506653466552e022c984bb57ea77e6d5d
|
|
| MD5 |
afce888775945b3cdd272fd12b004212
|
|
| BLAKE2b-256 |
cffd1dfaca943916b089c76b3ddfbc5b4c1b593cfca4a6f08eee16c5f70edfb8
|