diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 3bd5894f425741..df77e82a3c67e1 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4568,6 +4568,11 @@ def test_annotated_in_other_types(self): X = List[Annotated[T, 5]] self.assertEqual(X[int], List[Annotated[int, 5]]) + def test_annotated_mro(self): + class X(Annotated[int, (1, 10)]): ... + self.assertEqual(X.__mro__, (X, int, object), + "Annotated should be transparent.") + class TypeAliasTests(BaseTestCase): def test_canonical_usage_with_variable_annotation(self): diff --git a/Lib/typing.py b/Lib/typing.py index a283fe40d2d3ff..35c57c21b37c21 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1575,7 +1575,7 @@ def __init__(self, origin, metadata): if isinstance(origin, _AnnotatedAlias): metadata = origin.__metadata__ + metadata origin = origin.__origin__ - super().__init__(origin, origin, name="Annotated") + super().__init__(origin, origin) self.__metadata__ = metadata def copy_with(self, params): @@ -1603,6 +1603,11 @@ def __eq__(self, other): def __hash__(self): return hash((self.__origin__, self.__metadata__)) + def __getattr__(self, attr): + if attr in {'__name__', '__qualname__'}: + return 'Annotated' + return super().__getattr__(attr) + class Annotated: """Add context specific metadata to a type.