bpo-44524: Fix an issue wherein _GenericAlias._name was not properl… · python/cpython@8bdf12e (original) (raw)

`@@ -4791,66 +4791,185 @@ def test_no_isinstance(self):

`

4791

4791

`issubclass(int, TypeGuard)

`

4792

4792

``

4793

4793

``

``

4794

`+

SpecialAttrsP = typing.ParamSpec('SpecialAttrsP')

`

``

4795

`+

SpecialAttrsT = typing.TypeVar('SpecialAttrsT', int, float, complex)

`

``

4796

+

``

4797

+

4794

4798

`class SpecialAttrsTests(BaseTestCase):

`

``

4799

+

4795

4800

`def test_special_attrs(self):

`

4796

``

`-

cls_to_check = (

`

``

4801

`+

cls_to_check = {

`

4797

4802

`# ABC classes

`

4798

``

`-

typing.AbstractSet,

`

4799

``

`-

typing.AsyncContextManager,

`

4800

``

`-

typing.AsyncGenerator,

`

4801

``

`-

typing.AsyncIterable,

`

4802

``

`-

typing.AsyncIterator,

`

4803

``

`-

typing.Awaitable,

`

4804

``

`-

typing.ByteString,

`

4805

``

`-

typing.Callable,

`

4806

``

`-

typing.ChainMap,

`

4807

``

`-

typing.Collection,

`

4808

``

`-

typing.Container,

`

4809

``

`-

typing.ContextManager,

`

4810

``

`-

typing.Coroutine,

`

4811

``

`-

typing.Counter,

`

4812

``

`-

typing.DefaultDict,

`

4813

``

`-

typing.Deque,

`

4814

``

`-

typing.Dict,

`

4815

``

`-

typing.FrozenSet,

`

4816

``

`-

typing.Generator,

`

4817

``

`-

typing.Hashable,

`

4818

``

`-

typing.ItemsView,

`

4819

``

`-

typing.Iterable,

`

4820

``

`-

typing.Iterator,

`

4821

``

`-

typing.KeysView,

`

4822

``

`-

typing.List,

`

4823

``

`-

typing.Mapping,

`

4824

``

`-

typing.MappingView,

`

4825

``

`-

typing.MutableMapping,

`

4826

``

`-

typing.MutableSequence,

`

4827

``

`-

typing.MutableSet,

`

4828

``

`-

typing.OrderedDict,

`

4829

``

`-

typing.Reversible,

`

4830

``

`-

typing.Sequence,

`

4831

``

`-

typing.Set,

`

4832

``

`-

typing.Sized,

`

4833

``

`-

typing.Tuple,

`

4834

``

`-

typing.Type,

`

4835

``

`-

typing.ValuesView,

`

``

4803

`+

typing.AbstractSet: 'AbstractSet',

`

``

4804

`+

typing.AsyncContextManager: 'AsyncContextManager',

`

``

4805

`+

typing.AsyncGenerator: 'AsyncGenerator',

`

``

4806

`+

typing.AsyncIterable: 'AsyncIterable',

`

``

4807

`+

typing.AsyncIterator: 'AsyncIterator',

`

``

4808

`+

typing.Awaitable: 'Awaitable',

`

``

4809

`+

typing.ByteString: 'ByteString',

`

``

4810

`+

typing.Callable: 'Callable',

`

``

4811

`+

typing.ChainMap: 'ChainMap',

`

``

4812

`+

typing.Collection: 'Collection',

`

``

4813

`+

typing.Container: 'Container',

`

``

4814

`+

typing.ContextManager: 'ContextManager',

`

``

4815

`+

typing.Coroutine: 'Coroutine',

`

``

4816

`+

typing.Counter: 'Counter',

`

``

4817

`+

typing.DefaultDict: 'DefaultDict',

`

``

4818

`+

typing.Deque: 'Deque',

`

``

4819

`+

typing.Dict: 'Dict',

`

``

4820

`+

typing.FrozenSet: 'FrozenSet',

`

``

4821

`+

typing.Generator: 'Generator',

`

``

4822

`+

typing.Hashable: 'Hashable',

`

``

4823

`+

typing.ItemsView: 'ItemsView',

`

``

4824

`+

typing.Iterable: 'Iterable',

`

``

4825

`+

typing.Iterator: 'Iterator',

`

``

4826

`+

typing.KeysView: 'KeysView',

`

``

4827

`+

typing.List: 'List',

`

``

4828

`+

typing.Mapping: 'Mapping',

`

``

4829

`+

typing.MappingView: 'MappingView',

`

``

4830

`+

typing.MutableMapping: 'MutableMapping',

`

``

4831

`+

typing.MutableSequence: 'MutableSequence',

`

``

4832

`+

typing.MutableSet: 'MutableSet',

`

``

4833

`+

typing.OrderedDict: 'OrderedDict',

`

``

4834

`+

typing.Reversible: 'Reversible',

`

``

4835

`+

typing.Sequence: 'Sequence',

`

``

4836

`+

typing.Set: 'Set',

`

``

4837

`+

typing.Sized: 'Sized',

`

``

4838

`+

typing.Tuple: 'Tuple',

`

``

4839

`+

typing.Type: 'Type',

`

``

4840

`+

typing.ValuesView: 'ValuesView',

`

``

4841

`+

Subscribed ABC classes

`

``

4842

`+

typing.AbstractSet[Any]: 'AbstractSet',

`

``

4843

`+

typing.AsyncContextManager[Any]: 'AsyncContextManager',

`

``

4844

`+

typing.AsyncGenerator[Any, Any]: 'AsyncGenerator',

`

``

4845

`+

typing.AsyncIterable[Any]: 'AsyncIterable',

`

``

4846

`+

typing.AsyncIterator[Any]: 'AsyncIterator',

`

``

4847

`+

typing.Awaitable[Any]: 'Awaitable',

`

``

4848

`+

typing.Callable[[], Any]: 'Callable',

`

``

4849

`+

typing.Callable[..., Any]: 'Callable',

`

``

4850

`+

typing.ChainMap[Any, Any]: 'ChainMap',

`

``

4851

`+

typing.Collection[Any]: 'Collection',

`

``

4852

`+

typing.Container[Any]: 'Container',

`

``

4853

`+

typing.ContextManager[Any]: 'ContextManager',

`

``

4854

`+

typing.Coroutine[Any, Any, Any]: 'Coroutine',

`

``

4855

`+

typing.Counter[Any]: 'Counter',

`

``

4856

`+

typing.DefaultDict[Any, Any]: 'DefaultDict',

`

``

4857

`+

typing.Deque[Any]: 'Deque',

`

``

4858

`+

typing.Dict[Any, Any]: 'Dict',

`

``

4859

`+

typing.FrozenSet[Any]: 'FrozenSet',

`

``

4860

`+

typing.Generator[Any, Any, Any]: 'Generator',

`

``

4861

`+

typing.ItemsView[Any, Any]: 'ItemsView',

`

``

4862

`+

typing.Iterable[Any]: 'Iterable',

`

``

4863

`+

typing.Iterator[Any]: 'Iterator',

`

``

4864

`+

typing.KeysView[Any]: 'KeysView',

`

``

4865

`+

typing.List[Any]: 'List',

`

``

4866

`+

typing.Mapping[Any, Any]: 'Mapping',

`

``

4867

`+

typing.MappingView[Any]: 'MappingView',

`

``

4868

`+

typing.MutableMapping[Any, Any]: 'MutableMapping',

`

``

4869

`+

typing.MutableSequence[Any]: 'MutableSequence',

`

``

4870

`+

typing.MutableSet[Any]: 'MutableSet',

`

``

4871

`+

typing.OrderedDict[Any, Any]: 'OrderedDict',

`

``

4872

`+

typing.Reversible[Any]: 'Reversible',

`

``

4873

`+

typing.Sequence[Any]: 'Sequence',

`

``

4874

`+

typing.Set[Any]: 'Set',

`

``

4875

`+

typing.Tuple[Any]: 'Tuple',

`

``

4876

`+

typing.Tuple[Any, ...]: 'Tuple',

`

``

4877

`+

typing.Type[Any]: 'Type',

`

``

4878

`+

typing.ValuesView[Any]: 'ValuesView',

`

4836

4879

`# Special Forms

`

4837

``

`-

typing.Any,

`

4838

``

`-

typing.NoReturn,

`

4839

``

`-

typing.ClassVar,

`

4840

``

`-

typing.Final,

`

4841

``

`-

typing.Union,

`

4842

``

`-

typing.Optional,

`

4843

``

`-

typing.Literal,

`

4844

``

`-

typing.TypeAlias,

`

4845

``

`-

typing.Concatenate,

`

4846

``

`-

typing.TypeGuard,

`

4847

``

`-

)

`

``

4880

`+

typing.Annotated: 'Annotated',

`

``

4881

`+

typing.Any: 'Any',

`

``

4882

`+

typing.ClassVar: 'ClassVar',

`

``

4883

`+

typing.Concatenate: 'Concatenate',

`

``

4884

`+

typing.Final: 'Final',

`

``

4885

`+

typing.ForwardRef: 'ForwardRef',

`

``

4886

`+

typing.Literal: 'Literal',

`

``

4887

`+

typing.NewType: 'NewType',

`

``

4888

`+

typing.NoReturn: 'NoReturn',

`

``

4889

`+

typing.Optional: 'Optional',

`

``

4890

`+

typing.TypeAlias: 'TypeAlias',

`

``

4891

`+

typing.TypeGuard: 'TypeGuard',

`

``

4892

`+

typing.TypeVar: 'TypeVar',

`

``

4893

`+

typing.Union: 'Union',

`

``

4894

`+

Subscribed special forms

`

``

4895

`+

typing.Annotated[Any, "Annotation"]: 'Annotated',

`

``

4896

`+

typing.ClassVar[Any]: 'ClassVar',

`

``

4897

`+

typing.Concatenate[Any, SpecialAttrsP]: 'Concatenate',

`

``

4898

`+

typing.Final[Any]: 'Final',

`

``

4899

`+

typing.Literal[Any]: 'Literal',

`

``

4900

`+

typing.Optional[Any]: 'Optional',

`

``

4901

`+

typing.TypeGuard[Any]: 'TypeGuard',

`

``

4902

`+

typing.Union[Any]: 'Any',

`

``

4903

`+

typing.Union[int, float]: 'Union',

`

``

4904

`+

Incompatible special forms (tested in test_special_attrs2)

`

``

4905

`+

- typing.ForwardRef('set[Any]')

`

``

4906

`+

- typing.NewType('TypeName', Any)

`

``

4907

`+

- typing.ParamSpec('SpecialAttrsP')

`

``

4908

`+

- typing.TypeVar('T')

`

``

4909

`+

}

`

4848

4910

``

4849

``

`-

for cls in cls_to_check:

`

``

4911

`+

for cls, name in cls_to_check.items():

`

4850

4912

`with self.subTest(cls=cls):

`

4851

``

`-

self.assertEqual(cls.name, cls._name)

`

4852

``

`-

self.assertEqual(cls.qualname, cls._name)

`

4853

``

`-

self.assertEqual(cls.module, 'typing')

`

``

4913

`+

self.assertEqual(cls.name, name, str(cls))

`

``

4914

`+

self.assertEqual(cls.qualname, name, str(cls))

`

``

4915

`+

self.assertEqual(cls.module, 'typing', str(cls))

`

``

4916

`+

self.assertEqual(getattr(cls, '_name', name), name, str(cls))

`

``

4917

`+

for proto in range(pickle.HIGHEST_PROTOCOL + 1):

`

``

4918

`+

s = pickle.dumps(cls, proto)

`

``

4919

`+

loaded = pickle.loads(s)

`

``

4920

`+

self.assertIs(cls, loaded)

`

``

4921

+

``

4922

`+

TypeName = typing.NewType('SpecialAttrsTests.TypeName', Any)

`

``

4923

+

``

4924

`+

def test_special_attrs2(self):

`

``

4925

`+

Forward refs provide a different introspection API. name and

`

``

4926

`+

qualname make little sense for forward refs as they can store

`

``

4927

`+

complex typing expressions.

`

``

4928

`+

fr = typing.ForwardRef('set[Any]')

`

``

4929

`+

self.assertFalse(hasattr(fr, 'name'))

`

``

4930

`+

self.assertFalse(hasattr(fr, 'qualname'))

`

``

4931

`+

self.assertEqual(fr.module, 'typing')

`

``

4932

`+

Forward refs are currently unpicklable.

`

``

4933

`+

for proto in range(pickle.HIGHEST_PROTOCOL + 1):

`

``

4934

`+

with self.assertRaises(TypeError) as exc:

`

``

4935

`+

pickle.dumps(fr, proto)

`

``

4936

+

``

4937

`+

self.assertEqual(SpecialAttrsTests.TypeName.name, 'TypeName')

`

``

4938

`+

self.assertEqual(

`

``

4939

`+

SpecialAttrsTests.TypeName.qualname,

`

``

4940

`+

'SpecialAttrsTests.TypeName',

`

``

4941

`+

)

`

``

4942

`+

self.assertEqual(

`

``

4943

`+

SpecialAttrsTests.TypeName.module,

`

``

4944

`+

'test.test_typing',

`

``

4945

`+

)

`

``

4946

`+

NewTypes are picklable assuming correct qualname information.

`

``

4947

`+

for proto in range(pickle.HIGHEST_PROTOCOL + 1):

`

``

4948

`+

s = pickle.dumps(SpecialAttrsTests.TypeName, proto)

`

``

4949

`+

loaded = pickle.loads(s)

`

``

4950

`+

self.assertIs(SpecialAttrsTests.TypeName, loaded)

`

``

4951

+

``

4952

`+

Type variables don't support non-global instantiation per PEP 484

`

``

4953

`+

restriction that "The argument to TypeVar() must be a string equal

`

``

4954

`+

to the variable name to which it is assigned". Thus, providing

`

``

4955

`+

qualname is unnecessary.

`

``

4956

`+

self.assertEqual(SpecialAttrsT.name, 'SpecialAttrsT')

`

``

4957

`+

self.assertFalse(hasattr(SpecialAttrsT, 'qualname'))

`

``

4958

`+

self.assertEqual(SpecialAttrsT.module, 'test.test_typing')

`

``

4959

`+

Module-level type variables are picklable.

`

``

4960

`+

for proto in range(pickle.HIGHEST_PROTOCOL + 1):

`

``

4961

`+

s = pickle.dumps(SpecialAttrsT, proto)

`

``

4962

`+

loaded = pickle.loads(s)

`

``

4963

`+

self.assertIs(SpecialAttrsT, loaded)

`

``

4964

+

``

4965

`+

self.assertEqual(SpecialAttrsP.name, 'SpecialAttrsP')

`

``

4966

`+

self.assertFalse(hasattr(SpecialAttrsP, 'qualname'))

`

``

4967

`+

self.assertEqual(SpecialAttrsP.module, 'test.test_typing')

`

``

4968

`+

Module-level ParamSpecs are picklable.

`

``

4969

`+

for proto in range(pickle.HIGHEST_PROTOCOL + 1):

`

``

4970

`+

s = pickle.dumps(SpecialAttrsP, proto)

`

``

4971

`+

loaded = pickle.loads(s)

`

``

4972

`+

self.assertIs(SpecialAttrsP, loaded)

`

4854

4973

``

4855

4974

`class AllTests(BaseTestCase):

`

4856

4975

`"""Tests for all."""

`