Skip to content

Commit da6129e

Browse files
authored
bpo-36961: Handle positional-only arguments in uparse.c (pythonGH-13412)
1 parent fa19a25 commit da6129e

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

Lib/test/test_future.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,18 @@ def test_annotations(self):
183183
eq('lambda a, b, c=True: a')
184184
eq("lambda a, b, c=True, *, d=1 << v2, e='str': a")
185185
eq("lambda a, b, c=True, *vararg, d, e='str', **kwargs: a + b")
186+
eq("lambda a, /, b, c=True, *vararg, d, e='str', **kwargs: a + b")
187+
eq('lambda x, /: x')
188+
eq('lambda x=1, /: x')
189+
eq('lambda x, /, y: x + y')
190+
eq('lambda x=1, /, y=2: x + y')
191+
eq('lambda x, /, y=1: x + y')
192+
eq('lambda x, /, y=1, *, z=3: x + y + z')
193+
eq('lambda x=1, /, y=2, *, z=3: x + y + z')
194+
eq('lambda x=1, /, y=2, *, z: x + y + z')
195+
eq('lambda x=1, y=2, z=3, /, w=4, *, l, l2: x + y + z + w + l + l2')
196+
eq('lambda x=1, y=2, z=3, /, w=4, *, l, l2, **kwargs: x + y + z + w + l + l2')
197+
eq('lambda x, /, y=1, *, z: x + y + z')
186198
eq('lambda x: lambda y: x + y')
187199
eq('1 if True else 2')
188200
eq('str or None if int or True else str or bytes or None')

Python/ast_unparse.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,22 +193,30 @@ static int
193193
append_ast_args(_PyUnicodeWriter *writer, arguments_ty args)
194194
{
195195
bool first;
196-
Py_ssize_t i, di, arg_count, default_count;
196+
Py_ssize_t i, di, arg_count, posonlyarg_count, default_count;
197197

198198
first = true;
199199

200-
/* positional arguments with defaults */
200+
/* positional-only and positional arguments with defaults */
201+
posonlyarg_count = asdl_seq_LEN(args->posonlyargs);
201202
arg_count = asdl_seq_LEN(args->args);
202203
default_count = asdl_seq_LEN(args->defaults);
203-
for (i = 0; i < arg_count; i++) {
204+
for (i = 0; i < posonlyarg_count + arg_count; i++) {
204205
APPEND_STR_IF_NOT_FIRST(", ");
205-
APPEND(arg, (arg_ty)asdl_seq_GET(args->args, i));
206+
if (i < posonlyarg_count){
207+
APPEND(arg, (arg_ty)asdl_seq_GET(args->posonlyargs, i));
208+
} else {
209+
APPEND(arg, (arg_ty)asdl_seq_GET(args->args, i-posonlyarg_count));
210+
}
206211

207-
di = i - arg_count + default_count;
212+
di = i - posonlyarg_count - arg_count + default_count;
208213
if (di >= 0) {
209214
APPEND_STR("=");
210215
APPEND_EXPR((expr_ty)asdl_seq_GET(args->defaults, di), PR_TEST);
211216
}
217+
if (posonlyarg_count && i + 1 == posonlyarg_count) {
218+
APPEND_STR(", /");
219+
}
212220
}
213221

214222
/* vararg, or bare '*' if no varargs but keyword-only arguments present */
@@ -251,7 +259,9 @@ static int
251259
append_ast_lambda(_PyUnicodeWriter *writer, expr_ty e, int level)
252260
{
253261
APPEND_STR_IF(level > PR_TEST, "(");
254-
APPEND_STR(asdl_seq_LEN(e->v.Lambda.args->args) ? "lambda " : "lambda");
262+
Py_ssize_t n_positional = (asdl_seq_LEN(e->v.Lambda.args->args) +
263+
asdl_seq_LEN(e->v.Lambda.args->posonlyargs));
264+
APPEND_STR(n_positional ? "lambda " : "lambda");
255265
APPEND(args, e->v.Lambda.args);
256266
APPEND_STR(": ");
257267
APPEND_EXPR(e->v.Lambda.body, PR_TEST);

0 commit comments

Comments
 (0)