From a7917a0e2ee3cd80d406a1714e73853ec39f0fd9 Mon Sep 17 00:00:00 2001 From: Fidget-Spinner <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 25 Dec 2020 23:36:51 +0800 Subject: [PATCH 1/3] Support PEP 604 and PEP 612 for typing.py get_args and get_origin --- Lib/test/test_typing.py | 7 +++++++ Lib/typing.py | 10 +++++++--- .../Library/2020-12-25-23-23-11.bpo-42740.F0rQ_E.rst | 2 ++ 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-25-23-23-11.bpo-42740.F0rQ_E.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index c340c8a898289d..cd003373089a0b 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3021,6 +3021,7 @@ class C(Generic[T]): pass self.assertIs(get_origin(Callable), collections.abc.Callable) self.assertIs(get_origin(list[int]), list) self.assertIs(get_origin(list), None) + self.assertIs(get_origin(list | str), types.Union) def test_get_args(self): T = TypeVar('T') @@ -3048,6 +3049,12 @@ class C(Generic[T]): pass self.assertEqual(get_args(Callable), ()) self.assertEqual(get_args(list[int]), (int,)) self.assertEqual(get_args(list), ()) + self.assertEqual(get_args(collections.abc.Callable[[int], str]), ([int], str)) + P = ParamSpec('P') + self.assertEqual(get_args(Callable[P, int]), (P, int)) + self.assertEqual(get_args(Callable[Concatenate[int, P], int]), + (Concatenate[int, P], int)) + self.assertEqual(get_args(list | str), (list, str)) class CollectionsAbcTests(BaseTestCase): diff --git a/Lib/typing.py b/Lib/typing.py index 7b79876d4ebc70..d1db76f2f8c193 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1668,6 +1668,8 @@ def get_origin(tp): return tp.__origin__ if tp is Generic: return Generic + if isinstance(tp, types.Union): + return types.Union return None @@ -1684,12 +1686,14 @@ def get_args(tp): """ if isinstance(tp, _AnnotatedAlias): return (tp.__origin__,) + tp.__metadata__ - if isinstance(tp, _GenericAlias): + if isinstance(tp, (_GenericAlias, GenericAlias)): res = tp.__args__ - if tp.__origin__ is collections.abc.Callable and res[0] is not Ellipsis: + if (tp.__origin__ is collections.abc.Callable + and not (res[0] is Ellipsis + or isinstance(res[0], (ParamSpec, _ConcatenateGenericAlias)))): res = (list(res[:-1]), res[-1]) return res - if isinstance(tp, GenericAlias): + if isinstance(tp, types.Union): return tp.__args__ return () diff --git a/Misc/NEWS.d/next/Library/2020-12-25-23-23-11.bpo-42740.F0rQ_E.rst b/Misc/NEWS.d/next/Library/2020-12-25-23-23-11.bpo-42740.F0rQ_E.rst new file mode 100644 index 00000000000000..b6663e9a5deca1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-25-23-23-11.bpo-42740.F0rQ_E.rst @@ -0,0 +1,2 @@ +:func:`typing.get_args` and :func:`typing.get_origin` now support :pep:`604` +union types and :pep:`612` ``Callable``. From b9467a4974be1ec40b8cd8c0fac94f2283622eb3 Mon Sep 17 00:00:00 2001 From: Fidget-Spinner <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 25 Dec 2020 23:41:31 +0800 Subject: [PATCH 2/3] Update 2020-12-25-23-23-11.bpo-42740.F0rQ_E.rst --- .../next/Library/2020-12-25-23-23-11.bpo-42740.F0rQ_E.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2020-12-25-23-23-11.bpo-42740.F0rQ_E.rst b/Misc/NEWS.d/next/Library/2020-12-25-23-23-11.bpo-42740.F0rQ_E.rst index b6663e9a5deca1..588d90f6233067 100644 --- a/Misc/NEWS.d/next/Library/2020-12-25-23-23-11.bpo-42740.F0rQ_E.rst +++ b/Misc/NEWS.d/next/Library/2020-12-25-23-23-11.bpo-42740.F0rQ_E.rst @@ -1,2 +1,2 @@ :func:`typing.get_args` and :func:`typing.get_origin` now support :pep:`604` -union types and :pep:`612` ``Callable``. +union types and :pep:`612` additions to ``Callable``. From 5a7cf9b052de49fde03f530aa1c65efb3408c671 Mon Sep 17 00:00:00 2001 From: Fidget-Spinner <28750310+Fidget-Spinner@users.noreply.github.com> Date: Sun, 27 Dec 2020 17:48:15 +0800 Subject: [PATCH 3/3] sync with other PR --- Lib/test/test_typing.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index cd003373089a0b..3b8efe16c6e238 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3050,6 +3050,10 @@ class C(Generic[T]): pass self.assertEqual(get_args(list[int]), (int,)) self.assertEqual(get_args(list), ()) self.assertEqual(get_args(collections.abc.Callable[[int], str]), ([int], str)) + self.assertEqual(get_args(collections.abc.Callable[..., str]), (..., str)) + self.assertEqual(get_args(collections.abc.Callable[[], str]), ([], str)) + self.assertEqual(get_args(collections.abc.Callable[[int], str]), + get_args(Callable[[int], str])) P = ParamSpec('P') self.assertEqual(get_args(Callable[P, int]), (P, int)) self.assertEqual(get_args(Callable[Concatenate[int, P], int]),