Swarmauri Typing
The Swarmauri Typing Library provides advanced type utilities for Python, enabling more expressive and flexible type annotations. It includes tools for creating intersection and union types dynamically.
Features
- Intersection Types: Create intersection types that combine multiple classes.
from typing import Type, TypeVar, Union, Any, Annotated, Tuple
T = TypeVar("T")
class IntersectionMetadata:
def __init__(self, classes: Tuple[Type[T]]):
self.classes = classes
def __repr__(self):
return f"IntersectionMetadata(classes={self.classes!r})"
class Intersection(type):
def __class_getitem__(cls, classes: Union[Type, Tuple[Type, ...]]) -> type:
if not isinstance(classes, tuple):
classes = (classes,)
common = set(classes[0].__mro__)
for c in classes[1:]:
common.intersection_update(c.__mro__)
ordered_common = [c for c in classes[0].__mro__ if c in common]
if not ordered_common:
return Annotated[Any, IntersectionMetadata(classes=(classes))]
else:
union_type = Union[tuple(ordered_common)]
return Annotated[union_type, IntersectionMetadata(classes=(classes))]
- Union Factory: Dynamically create union types based on a provided function.
from typing import Type, TypeVar, Callable, List, Union, Any, Annotated, get_args, Optional
T = TypeVar("T")
class UnionFactoryMetadata:
def __init__(self, data: Any, name: Optional[str] = None):
self.data = data
self.name = name or self.__class__.__name__
def __repr__(self):
return f"UnionFactoryMetadata(name={self.name!r}, data={self.data!r})"
class UnionFactory:
def __init__(self, bound: Callable[[Type[T]], List[type]], name: str = None, annotation_extenders: List[Any] = None):
self.name = name or self.__class__.__name__
self._union_types_getter = bound
self._annotation_extenders = annotation_extenders or []
def _add_metadata(self, annotated_type: Any, new_metadata: Any) -> Any:
if not (hasattr(annotated_type, '__origin__') and annotated_type.__origin__ is Annotated):
return Annotated[annotated_type, new_metadata]
args = get_args(annotated_type)
base_type = args[0]
old_metadata = args[1:]
return Annotated[base_type, *old_metadata, new_metadata]
def __getitem__(self, input_data: Union[Type[T], str]) -> type:
if isinstance(input_data, str):
model_name = input_data
else:
model_name = input_data.__name__
union_members = self._union_types_getter(model_name)
if not union_members:
final_annotated = Annotated[Any, UnionFactoryMetadata(data=model_name, name=self.name)]
else:
union_type = Union[tuple(union_members)]
final_annotated = Annotated[union_type, UnionFactoryMetadata(data=model_name, name=self.name)]
for extension in self._annotation_extenders:
final_annotated = self._add_metadata(final_annotated, extension)
return final_annotated
Getting Started
To start using the Swarmauri Typing Library, include it as a module in your Python project. Ensure you have Python 3.10 or later installed.
Steps to install via pypi
pip install swarmauri-typing
Usage Example
from swarmauri_typing import Intersection, UnionFactory
# Example of using Intersection
class A: pass
class B: pass
IntersectionType = Intersection[A, B]
# Example of using UnionFactory
def my_types_getter(name: str):
return [A, B]
union_factory = UnionFactory(my_types_getter)
MyUnion = union_factory["MyModel"]
Contributing
Contributions are welcome! If you'd like to add a new feature, fix a bug, or improve documentation, kindly go through the contributions guidelines first.
Metadata
Release files for swarmauri_typing 0.10.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| swarmauri_typing-0.10.0.tar.gz | 8.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| swarmauri_typing-0.10.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.6 kB
Release files / swarmauri_typing-0.10.0.tar.gz
| Download URL | swarmauri_typing-0.10.0.tar.gz |
|---|---|
| Size | 8.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
35bd667166414d077730cbae39494ee97f050021bca5af1fb7a8faf6950684fe
|
|
BLAKE2b-256 checksum How to use checksums |
da209fa60c8640e132b05cfed13221926d1a1c503e4ee2ce1a3624448edbce19
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.0 {"installer":{"name":"uv","version":"0.11.0","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 / swarmauri_typing-0.10.0-py3-none-any.whl
| Download URL | swarmauri_typing-0.10.0-py3-none-any.whl |
|---|---|
| Size | 9.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
24c7d48e8be725e41e76530f142f3ab0262ad5ad3583c945966d87d93f031ee0
|
|
BLAKE2b-256 checksum How to use checksums |
454dc348ee048aec893d1fdab5837c94567013bb0140f97b304ca1691ecd1995
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.0 {"installer":{"name":"uv","version":"0.11.0","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}
|