diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2018-09-30 18:07:05 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-30 18:07:05 (GMT) |
commit | 2a2940e5c3e6d92f4fac5e9d361a1e224bb2f12e (patch) | |
tree | f703ecf4a37603fcc39e4d30bbec30c0f262e3f0 /Python | |
parent | d5bd036138881bb90a803397d992870a46fbdc2d (diff) | |
download | cpython-2a2940e5c3e6d92f4fac5e9d361a1e224bb2f12e.zip cpython-2a2940e5c3e6d92f4fac5e9d361a1e224bb2f12e.tar.gz cpython-2a2940e5c3e6d92f4fac5e9d361a1e224bb2f12e.tar.bz2 |
bpo-34854: Fix compiling string annotations containing lambdas. (GH-9645)
* Compiling a string annotation containing a lambda with keyword-only
argument without default value caused a crash.
* Remove the final "*" (it is incorrect syntax) in the representation of
lambda without *args and keyword-only arguments when compile from AST.
* Improve the representation of lambda without arguments.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/ast_unparse.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index 56ea3c4..916ad5f 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -212,7 +212,7 @@ append_ast_args(_PyUnicodeWriter *writer, arguments_ty args) } /* vararg, or bare '*' if no varargs but keyword-only arguments present */ - if (args->vararg || args->kwonlyargs) { + if (args->vararg || asdl_seq_LEN(args->kwonlyargs)) { APPEND_STR_IF_NOT_FIRST(", "); APPEND_STR("*"); if (args->vararg) { @@ -229,8 +229,11 @@ append_ast_args(_PyUnicodeWriter *writer, arguments_ty args) di = i - arg_count + default_count; if (di >= 0) { - APPEND_STR("="); - APPEND_EXPR((expr_ty)asdl_seq_GET(args->kw_defaults, di), PR_TEST); + expr_ty default_ = (expr_ty)asdl_seq_GET(args->kw_defaults, di); + if (default_) { + APPEND_STR("="); + APPEND_EXPR(default_, PR_TEST); + } } } @@ -248,7 +251,7 @@ static int append_ast_lambda(_PyUnicodeWriter *writer, expr_ty e, int level) { APPEND_STR_IF(level > PR_TEST, "("); - APPEND_STR("lambda "); + APPEND_STR(asdl_seq_LEN(e->v.Lambda.args->args) ? "lambda " : "lambda"); APPEND(args, e->v.Lambda.args); APPEND_STR(": "); APPEND_EXPR(e->v.Lambda.body, PR_TEST); |