This repository includes typing used in the Swarmauri framework.
Project description
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.
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
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
File details
Details for the file swarmauri_typing-0.9.0.dev3.tar.gz.
File metadata
- Download URL: swarmauri_typing-0.9.0.dev3.tar.gz
- Upload date:
- Size: 4.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18d2e6b71a8d1432d1aebb5ec91874bc28c784f5669f17c69c8a4facb9d4b4f9
|
|
| MD5 |
8d555627eb07c1af407bb0618286e2e0
|
|
| BLAKE2b-256 |
5838c4d305b61c93acba157c383c93117434b30d5b64b8c3c15c0b9c61dda43d
|
File details
Details for the file swarmauri_typing-0.9.0.dev3-py3-none-any.whl.
File metadata
- Download URL: swarmauri_typing-0.9.0.dev3-py3-none-any.whl
- Upload date:
- Size: 5.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfaad75e72b91ed3ebe58711190d0e7b0e3e6b6ec0273a491ed11e5523f61406
|
|
| MD5 |
3fc2086e7fcd6763bb777ce4715a19f7
|
|
| BLAKE2b-256 |
e248db40197df87d299ddf835928ff70ad19b223c0138d546d9f70ecd7ed6d42
|