diff options
author | Benjamin Peterson <benjamin@python.org> | 2009-11-19 22:54:57 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2009-11-19 22:54:57 (GMT) |
commit | 99a5023c80d9a690e4305e2ded1b2a9cf6b30251 (patch) | |
tree | 3fb07d09a0ba874e6607b11b1ad9cc55515c1daa /Python | |
parent | b678de8ba643d940009f26d50d3f6014305f152c (diff) | |
download | cpython-99a5023c80d9a690e4305e2ded1b2a9cf6b30251.zip cpython-99a5023c80d9a690e4305e2ded1b2a9cf6b30251.tar.gz cpython-99a5023c80d9a690e4305e2ded1b2a9cf6b30251.tar.bz2 |
improve several corner cases related with argument names in parenthesis
- Fix #7362: give a good error message for parenthesized arguments with
defaults.
- Add a py3k warning for any parenthesized arguments since those are not allowed
in Py3. This warning is not given in tuple unpacking, since that incurs the
tuple unpacking warning.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/ast.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/Python/ast.c b/Python/ast.c index 7f379a5..c8875e0 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -692,7 +692,8 @@ ast_for_arguments(struct compiling *c, const node *n) while (i < NCH(n)) { ch = CHILD(n, i); switch (TYPE(ch)) { - case fpdef: + case fpdef: { + int complex_args = 0, parenthesized = 0; handle_fpdef: /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is anything other than EQUAL or a comma? */ @@ -707,6 +708,12 @@ ast_for_arguments(struct compiling *c, const node *n) found_default = 1; } else if (found_default) { + /* def f((x)=4): pass should raise an error. + def f((x, (y))): pass will just incur the tuple unpacking warning. */ + if (parenthesized && !complex_args) { + ast_error(n, "parenthesized arg with default"); + goto error; + } ast_error(n, "non-default argument follows default argument"); goto error; @@ -719,6 +726,7 @@ ast_for_arguments(struct compiling *c, const node *n) if (Py_Py3kWarningFlag && !ast_warn(c, ch, "tuple parameter unpacking has been removed in 3.x")) goto error; + complex_args = 1; asdl_seq_SET(args, k++, compiler_complex_args(c, ch)); if (!asdl_seq_GET(args, k-1)) goto error; @@ -726,6 +734,7 @@ ast_for_arguments(struct compiling *c, const node *n) /* def foo((x)): setup for checking NAME below. */ /* Loop because there can be many parens and tuple unpacking mixed in. */ + parenthesized = 1; ch = CHILD(ch, 0); assert(TYPE(ch) == fpdef); goto handle_fpdef; @@ -747,7 +756,13 @@ ast_for_arguments(struct compiling *c, const node *n) } i += 2; /* the name and the comma */ + if (parenthesized && Py_Py3kWarningFlag && + !ast_warn(c, ch, "parenthesized argument names " + "are invalid in 3.x")) + goto error; + break; + } case STAR: if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1)))) goto error; |