diff options
author | Batuhan Taskaya <batuhanosmantaskaya@gmail.com> | 2020-05-18 18:23:48 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-18 18:23:48 (GMT) |
commit | 2135e10dc717c00d10d899d232bebfc59bb25032 (patch) | |
tree | 46adae3fe2b52187e2ae3656fb9a50be0e582c20 | |
parent | e6578a226d8a8a13d1062d154fad0fef28ee2416 (diff) | |
download | cpython-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.py | 3 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2020-05-17-20-38-12.bpo-40663.u2aiZf.rst | 2 | ||||
-rw-r--r-- | Python/ast_unparse.c | 13 |
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("]"); } |