diff --git a/aioinject/providers.py b/aioinject/providers.py index 51b5ee6..5d0571d 100644 --- a/aioinject/providers.py +++ b/aioinject/providers.py @@ -96,7 +96,7 @@ def _typevar_map( if not origin: continue - params = origin.__parameters__ + params = getattr(origin, "__parameters__", ()) args = typing.get_args(base) typevar_map |= dict(zip(params, args, strict=False)) diff --git a/tests/features/test_generics.py b/tests/features/test_generics.py index bd28159..4aaafdb 100644 --- a/tests/features/test_generics.py +++ b/tests/features/test_generics.py @@ -1,5 +1,7 @@ from typing import Generic, TypeVar +import pytest + from aioinject import Container, Object, Scoped from aioinject.providers import Dependency @@ -43,11 +45,23 @@ async def test_generic_dependency() -> None: ) -async def test_resolve_generics() -> None: +@pytest.mark.parametrize( + ("type_", "instanceof"), + [ + (GenericService, GenericService), + (WithGenericDependency[int], WithGenericDependency), + (ConstrainedGenericDependency, ConstrainedGenericDependency), + ], +) +async def test_resolve_generics( + type_: type[object], + instanceof: type[object], +) -> None: container = Container() - container.register(Scoped(WithGenericDependency[int])) + container.register(Scoped(type_)) container.register(Object(42)) + container.register(Object("42")) async with container.context() as ctx: - instance = await ctx.resolve(WithGenericDependency[int]) - assert isinstance(instance, WithGenericDependency) + instance = await ctx.resolve(type_) + assert isinstance(instance, instanceof)