[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