Skip to content

Commit efb1f09

Browse files
bpo-42740: Support PEP 604, 612 for typing.py get_args and get_origin (GH-23942)
1 parent a6d63a2 commit efb1f09

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

Lib/test/test_typing.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3021,6 +3021,7 @@ class C(Generic[T]): pass
30213021
self.assertIs(get_origin(Callable), collections.abc.Callable)
30223022
self.assertIs(get_origin(list[int]), list)
30233023
self.assertIs(get_origin(list), None)
3024+
self.assertIs(get_origin(list | str), types.Union)
30243025

30253026
def test_get_args(self):
30263027
T = TypeVar('T')
@@ -3053,6 +3054,11 @@ class C(Generic[T]): pass
30533054
self.assertEqual(get_args(collections.abc.Callable[[], str]), ([], str))
30543055
self.assertEqual(get_args(collections.abc.Callable[[int], str]),
30553056
get_args(Callable[[int], str]))
3057+
P = ParamSpec('P')
3058+
self.assertEqual(get_args(Callable[P, int]), (P, int))
3059+
self.assertEqual(get_args(Callable[Concatenate[int, P], int]),
3060+
(Concatenate[int, P], int))
3061+
self.assertEqual(get_args(list | str), (list, str))
30563062

30573063

30583064
class CollectionsAbcTests(BaseTestCase):

Lib/typing.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1668,6 +1668,8 @@ def get_origin(tp):
16681668
return tp.__origin__
16691669
if tp is Generic:
16701670
return Generic
1671+
if isinstance(tp, types.Union):
1672+
return types.Union
16711673
return None
16721674

16731675

@@ -1686,9 +1688,13 @@ def get_args(tp):
16861688
return (tp.__origin__,) + tp.__metadata__
16871689
if isinstance(tp, (_GenericAlias, GenericAlias)):
16881690
res = tp.__args__
1689-
if tp.__origin__ is collections.abc.Callable and res[0] is not Ellipsis:
1691+
if (tp.__origin__ is collections.abc.Callable
1692+
and not (res[0] is Ellipsis
1693+
or isinstance(res[0], (ParamSpec, _ConcatenateGenericAlias)))):
16901694
res = (list(res[:-1]), res[-1])
16911695
return res
1696+
if isinstance(tp, types.Union):
1697+
return tp.__args__
16921698
return ()
16931699

16941700

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
:func:`typing.get_args` and :func:`typing.get_origin` now support :pep:`604`
2+
union types and :pep:`612` additions to ``Callable``.

0 commit comments

Comments
 (0)