summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBatuhan Taskaya <batuhanosmantaskaya@gmail.com>2020-05-18 18:23:48 (GMT)
committerGitHub <noreply@github.com>2020-05-18 18:23:48 (GMT)
commit2135e10dc717c00d10d899d232bebfc59bb25032 (patch)
tree46adae3fe2b52187e2ae3656fb9a50be0e582c20
parente6578a226d8a8a13d1062d154fad0fef28ee2416 (diff)
downloadcpython-2135e10dc717c00d10d899d232bebfc59bb25032.zip
cpython-2135e10dc717c00d10d899d232bebfc59bb25032.tar.gz
cpython-2135e10dc717c00d10d899d232bebfc59bb25032.tar.bz2
bpo-40663: Correctly handle annotations with subscripts in ast_unparse.c (GH-20156)
-rw-r--r--Lib/test/test_future.py3
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2020-05-17-20-38-12.bpo-40663.u2aiZf.rst2
-rw-r--r--Python/ast_unparse.c13
3 files changed, 17 insertions, 1 deletions
diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py
index 56b7ac6..0f40357 100644
--- a/Lib/test/test_future.py
+++ b/Lib/test/test_future.py
@@ -275,6 +275,9 @@ class AnnotationsFutureTestCase(unittest.TestCase):
eq("dict[str, int]")
eq("set[str,]")
eq("tuple[str, ...]")
+ eq("tuple[(str, *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 0000000..5041abc
--- /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 d1e9d42..e699751 100644
--- a/Python/ast_unparse.c
+++ b/Python/ast_unparse.c
@@ -781,8 +781,19 @@ static int
append_ast_subscript(_PyUnicodeWriter *writer, expr_ty e)
{
APPEND_EXPR(e->v.Subscript.value, PR_ATOM);
+ int level = PR_TUPLE;
+ expr_ty slice = e->v.Subscript.slice;
+ if (slice->kind == Tuple_kind) {
+ for (Py_ssize_t i = 0; i < asdl_seq_LEN(slice->v.Tuple.elts); i++) {
+ expr_ty element = asdl_seq_GET(slice->v.Tuple.elts, i);
+ if (element->kind == Starred_kind) {
+ ++level;
+ break;
+ }
+ }
+ }
APPEND_STR("[");
- APPEND_EXPR(e->v.Subscript.slice, PR_TUPLE);
+ APPEND_EXPR(e->v.Subscript.slice, level);
APPEND_STR_FINISH("]");
}