mirror of
https://github.com/python/cpython.git
synced 2025-11-01 10:45:30 +00:00
bpo-39481: Implementation for PEP 585 (#18239)
This implements things like `list[int]`, which returns an object of type `types.GenericAlias`. This object mostly acts as a proxy for `list`, but has attributes `__origin__` and `__args__` that allow recovering the parts (with values `list` and `(int,)`. There is also an approximate notion of type variables; e.g. `list[T]` has a `__parameters__` attribute equal to `(T,)`. Type variables are objects of type `typing.TypeVar`.
This commit is contained in:
parent
9cc3ebd7e0
commit
48b069a003
30 changed files with 830 additions and 53 deletions
|
|
@ -1775,10 +1775,11 @@ class GenericTests(BaseTestCase):
|
|||
self.assertEqual(T1[int, T].__origin__, T1)
|
||||
|
||||
self.assertEqual(T2.__parameters__, (T,))
|
||||
with self.assertRaises(TypeError):
|
||||
T1[int]
|
||||
with self.assertRaises(TypeError):
|
||||
T2[int, str]
|
||||
# These don't work because of tuple.__class_item__
|
||||
## with self.assertRaises(TypeError):
|
||||
## T1[int]
|
||||
## with self.assertRaises(TypeError):
|
||||
## T2[int, str]
|
||||
|
||||
self.assertEqual(repr(C1[int]).split('.')[-1], 'C1[int]')
|
||||
self.assertEqual(C2.__parameters__, ())
|
||||
|
|
@ -1817,22 +1818,22 @@ class GenericTests(BaseTestCase):
|
|||
self.clear_caches()
|
||||
class MyTup(Tuple[T, T]): ...
|
||||
self.assertIs(MyTup[int]().__class__, MyTup)
|
||||
self.assertIs(MyTup[int]().__orig_class__, MyTup[int])
|
||||
self.assertEqual(MyTup[int]().__orig_class__, MyTup[int])
|
||||
class MyCall(Callable[..., T]):
|
||||
def __call__(self): return None
|
||||
self.assertIs(MyCall[T]().__class__, MyCall)
|
||||
self.assertIs(MyCall[T]().__orig_class__, MyCall[T])
|
||||
self.assertEqual(MyCall[T]().__orig_class__, MyCall[T])
|
||||
class MyDict(typing.Dict[T, T]): ...
|
||||
self.assertIs(MyDict[int]().__class__, MyDict)
|
||||
self.assertIs(MyDict[int]().__orig_class__, MyDict[int])
|
||||
self.assertEqual(MyDict[int]().__orig_class__, MyDict[int])
|
||||
class MyDef(typing.DefaultDict[str, T]): ...
|
||||
self.assertIs(MyDef[int]().__class__, MyDef)
|
||||
self.assertIs(MyDef[int]().__orig_class__, MyDef[int])
|
||||
self.assertEqual(MyDef[int]().__orig_class__, MyDef[int])
|
||||
# ChainMap was added in 3.3
|
||||
if sys.version_info >= (3, 3):
|
||||
class MyChain(typing.ChainMap[str, T]): ...
|
||||
self.assertIs(MyChain[int]().__class__, MyChain)
|
||||
self.assertIs(MyChain[int]().__orig_class__, MyChain[int])
|
||||
self.assertEqual(MyChain[int]().__orig_class__, MyChain[int])
|
||||
|
||||
def test_all_repr_eq_any(self):
|
||||
objs = (getattr(typing, el) for el in typing.__all__)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue