A package to determine the values of generic classes through instances or subclasses
Project description
Python-Generics
This package provides functionalities to determine the values of generic type variables in Python.
As of now, it only supports two functions: get_type_vars
and get_filled_type
.
These functions work also with pydantic generic models (only tested with pydantic > v2.3.0).
The package has no dependencies itself.
Installation
The package is available on PyPI:
pip install python-generics
How to use (in your own application)
The get_type_vars
function returns a tuple of all type variables for a given generic type. The TypeVar
s are
determined by Generic
if the type is a subclass of Generic
. Otherwise, they are determined by the indexed
supertypes (the order of the returned tuple is the lexicographical in the list of the supertypes).
from typing import Generic, TypeVar
from generics import get_type_vars
T = TypeVar("T")
U = TypeVar("U")
V = TypeVar("V")
class A(Generic[T, U]):
pass
class B(A[T, U], Generic[U, T]):
pass
class C(B[T, U], A[T, V]):
pass
assert get_type_vars(A) == (T, U)
assert get_type_vars(B) == (U, T)
assert get_type_vars(C) == (T, U, V)
The get_filled_type
function determines for a single TypeVar
the value if defined somewhere.
To determine the value, you have to pass a type or an instance of a type that is a subclass of a generic type
of which you want to determine the value of the TypeVar
.
Instead of supplying the TypeVar
itself, you can define the integer position of the TypeVar
in the tuple of
TypeVar
s of the generic type.
from typing import Generic, TypeVar
from generics import get_filled_type
T = TypeVar("T")
U = TypeVar("U")
V = TypeVar("V")
class A(Generic[T, U]):
pass
class B(A[str, U]):
pass
assert get_filled_type(A[str, U], A, T) == str
assert get_filled_type(B[int](), A, 0) == str
The get_filled_type
function is especially useful if you have generic super types in which you want to determine
the value of a TypeVar
inside methods.
from typing import Generic, TypeVar, Any
from generics import get_filled_type
T = TypeVar("T")
class MySuperType(Generic[T]):
def get_type(self) -> Any:
return get_filled_type(self, MySuperType, 0)
class MySubType(MySuperType[str]):
pass
assert MySubType().get_type() == str
How to use this Repository on Your Machine (as a developer)
Follow the instructions in our Python template repository.
Contribute
You are very welcome to contribute to this template repository by opening a pull request against the main branch.
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
Built Distribution
Hashes for python_generics-0.0.4-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6ddc6add0c322d7483767974ff276e3037faeb6f2287281c269016e271a0da25 |
|
MD5 | c54614518f238e12825b0be4e187e81a |
|
BLAKE2b-256 | 791ec33eee5722d949a46d898d0d59fae975266f96fd04c49181d91ea55e597a |