[Python-checkins] bpo-42740: Fix get_args for PEP 585 collections.abc.Callable (GH-23963)

miss-islington webhook-mailer at python.org
Mon Dec 28 15:26:48 EST 2020


https://github.com/python/cpython/commit/03e571f1d5f3e7a11f33bb9f47dd4acedf17b166
commit: 03e571f1d5f3e7a11f33bb9f47dd4acedf17b166
branch: 3.9
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2020-12-28T12:26:39-08:00
summary:

bpo-42740: Fix get_args for PEP 585 collections.abc.Callable (GH-23963)


PR 1/2. Needs backport to 3.9.
(cherry picked from commit 4140f10a16f06c32fd49f9e21fb2a53abe7357f0)

Co-authored-by: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com>

files:
M Lib/test/test_typing.py
M Lib/typing.py

diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 3b3aa29de7221..4bdb2a0fad6c7 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -3071,6 +3071,11 @@ 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))
+        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]))
 
 
 class CollectionsAbcTests(BaseTestCase):
diff --git a/Lib/typing.py b/Lib/typing.py
index 81e4a2fa403b9..3556b8adb8190 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -1507,13 +1507,11 @@ 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:
             res = (list(res[:-1]), res[-1])
         return res
-    if isinstance(tp, GenericAlias):
-        return tp.__args__
     return ()
 
 



More information about the Python-checkins mailing list