From: Batuhan Taskaya Date: Fri, 22 May 2020 22:32:40 +0000 (+0300) Subject: [3.8] bpo-40663: Correctly handle annotations with subscripts in ast_unparse.c (GH... X-Git-Tag: v3.8.4rc1~100 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a4d219b35e35f9efc406cd70f2812275bcd989fe;p=thirdparty%2FPython%2Fcpython.git [3.8] bpo-40663: Correctly handle annotations with subscripts in ast_unparse.c (GH-20156). (GH-20191) (cherry picked from commit 2135e10dc717c00d10d899d232bebfc59bb25032) Co-authored-by: Batuhan Taskaya --- diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py index ea13533b5143..57946467d681 100644 --- a/Lib/test/test_future.py +++ b/Lib/test/test_future.py @@ -265,6 +265,10 @@ class AnnotationsFutureTestCase(unittest.TestCase): eq("dict[str, int]") eq("set[str,]") eq("tuple[str, ...]") + eq("tuple[(str, *types)]") + eq("tuple[xx:yy, (*types,)]") + eq("tuple[str, int, (str, int)]") + eq("tuple[(*int, str, str, (str, int))]") eq("tuple[str, int, float, dict[str, int]]") eq("slice[0]") eq("slice[0:1]") diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-17-20-38-12.bpo-40663.u2aiZf.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-17-20-38-12.bpo-40663.u2aiZf.rst new file mode 100644 index 000000000000..5041abc7e3ea --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-05-17-20-38-12.bpo-40663.u2aiZf.rst @@ -0,0 +1,2 @@ +Correctly generate annotations where parentheses are omitted but required +(e.g: ``Type[(str, int, *other))]``. diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index 1a7cd236aafa..af9604eb45b1 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -750,6 +750,24 @@ append_ast_ext_slice(_PyUnicodeWriter *writer, slice_ty slice) return 0; } +static int +append_ast_index_slice(_PyUnicodeWriter *writer, slice_ty slice) +{ + int level = PR_TUPLE; + expr_ty value = slice->v.Index.value; + if (value->kind == Tuple_kind) { + for (Py_ssize_t i = 0; i < asdl_seq_LEN(value->v.Tuple.elts); i++) { + expr_ty element = asdl_seq_GET(value->v.Tuple.elts, i); + if (element->kind == Starred_kind) { + ++level; + break; + } + } + } + APPEND_EXPR(value, level); + return 0; +} + static int append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice) { @@ -759,8 +777,7 @@ append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice) case ExtSlice_kind: return append_ast_ext_slice(writer, slice); case Index_kind: - APPEND_EXPR(slice->v.Index.value, PR_TUPLE); - return 0; + return append_ast_index_slice(writer, slice); default: PyErr_SetString(PyExc_SystemError, "unexpected slice kind");