def module(): from typing import Generic, TypeVar from pydantic import BaseModel from pydantic.generics import GenericModel, _generic_types_cache t = TypeVar('t') class MyGeneric(GenericModel, Generic[t]): value: t class Model(BaseModel): ... concrete = MyGeneric[Model] _generic_types_cache.clear() second_concrete = MyGeneric[Model] class Model(BaseModel ): # same name, but type different, so it's not in cache ... third_concrete = MyGeneric[Model] assert concrete is not second_concrete assert concrete is not third_concrete assert second_concrete is not third_concrete assert globals()['MyGeneric[Model]'] is concrete assert globals()['MyGeneric[Model]_'] is second_concrete assert globals()['MyGeneric[Model]__'] is third_concrete
def module(): from typing import Generic, TypeVar import pytest from pydantic.generics import GenericModel, _generic_types_cache t = TypeVar('t') class MyGeneric(GenericModel, Generic[t]): value: t concrete = MyGeneric[t] _generic_types_cache.clear() with pytest.raises( TypeError, match= r"'MyGeneric\[t\]' already defined above, please consider reusing it" ) as exc_info: MyGeneric[t] cause = exc_info.value.__cause__ assert isinstance(cause, NameError), cause expected_message = f"Name conflict: 'MyGeneric[t]' in {__name__!r} is already used by {concrete!r}" assert cause.args[ 0] == expected_message, f'{cause.args[0]} != {expected_message}'