diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2020-04-27 07:27:21 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-27 07:27:21 (GMT) |
commit | 6292be7adf247589bbf03524f8883cb4cb61f3e9 (patch) | |
tree | 491a02064847cb3158bd029e178486b42bbc23e7 /Lib | |
parent | caf1aadf3d020f742ba3d7fcf678ca700224914b (diff) | |
download | cpython-6292be7adf247589bbf03524f8883cb4cb61f3e9.zip cpython-6292be7adf247589bbf03524f8883cb4cb61f3e9.tar.gz cpython-6292be7adf247589bbf03524f8883cb4cb61f3e9.tar.bz2 |
bpo-40398: Fix typing.get_args() for special generic aliases. (GH-19720)
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_typing.py | 9 | ||||
-rw-r--r-- | Lib/typing.py | 4 |
2 files changed, 10 insertions, 3 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 46e0ea5..f191d3b 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3007,6 +3007,8 @@ class GetUtilitiesTestCase(TestCase): self.assertIs(get_origin(List[Tuple[T, T]][int]), list) self.assertIs(get_origin(Annotated[T, 'thing']), Annotated) self.assertIs(get_origin(List), list) + self.assertIs(get_origin(Tuple), tuple) + self.assertIs(get_origin(Callable), collections.abc.Callable) self.assertIs(get_origin(list[int]), list) self.assertIs(get_origin(list), None) @@ -3024,13 +3026,16 @@ class GetUtilitiesTestCase(TestCase): (int, Tuple[str, int])) self.assertEqual(get_args(typing.Dict[int, Tuple[T, T]][Optional[int]]), (int, Tuple[Optional[int], Optional[int]])) - self.assertEqual(get_args(Callable[[], T][int]), ([], int,)) + self.assertEqual(get_args(Callable[[], T][int]), ([], int)) + self.assertEqual(get_args(Callable[..., int]), (..., int)) self.assertEqual(get_args(Union[int, Callable[[Tuple[T, ...]], str]]), (int, Callable[[Tuple[T, ...]], str])) self.assertEqual(get_args(Tuple[int, ...]), (int, ...)) self.assertEqual(get_args(Tuple[()]), ((),)) self.assertEqual(get_args(Annotated[T, 'one', 2, ['three']]), (T, 'one', 2, ['three'])) - self.assertEqual(get_args(List), (typing.T,)) + self.assertEqual(get_args(List), ()) + self.assertEqual(get_args(Tuple), ()) + self.assertEqual(get_args(Callable), ()) self.assertEqual(get_args(list[int]), (int,)) self.assertEqual(get_args(list), ()) diff --git a/Lib/typing.py b/Lib/typing.py index 1aefcb8..c829898 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1420,11 +1420,13 @@ def get_args(tp): """ if isinstance(tp, _AnnotatedAlias): return (tp.__origin__,) + tp.__metadata__ - if isinstance(tp, (_GenericAlias, GenericAlias)): + if isinstance(tp, _GenericAlias) and not tp._special: 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 () |