mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Issue #1573, second attempt:
"def f(*, **kw)" now raises a SyntaxError.
This commit is contained in:
parent
3279b5df3c
commit
40d3a67a19
3 changed files with 9 additions and 13 deletions
|
@ -58,9 +58,6 @@ exec_tests = [
|
||||||
"break",
|
"break",
|
||||||
# Continue
|
# Continue
|
||||||
"continue",
|
"continue",
|
||||||
# kw only funcs
|
|
||||||
"def f(*, kw=1): pass",
|
|
||||||
"def f(*, **kw): pass",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# These are compiled through "single"
|
# These are compiled through "single"
|
||||||
|
|
|
@ -48,6 +48,7 @@ class KeywordOnlyArgTestCase(unittest.TestCase):
|
||||||
self.assertRaisesSyntaxError("def f(p1, *, p1=100):\n pass\n")
|
self.assertRaisesSyntaxError("def f(p1, *, p1=100):\n pass\n")
|
||||||
self.assertRaisesSyntaxError("def f(p1, *k1, k1=100):\n pass\n")
|
self.assertRaisesSyntaxError("def f(p1, *k1, k1=100):\n pass\n")
|
||||||
self.assertRaisesSyntaxError("def f(p1, *, k1, k1=100):\n pass\n")
|
self.assertRaisesSyntaxError("def f(p1, *, k1, k1=100):\n pass\n")
|
||||||
|
self.assertRaisesSyntaxError("def f(p1, *, **k1):\n pass\n")
|
||||||
self.assertRaisesSyntaxError("def f(p1, *, k1, **k1):\n pass\n")
|
self.assertRaisesSyntaxError("def f(p1, *, k1, **k1):\n pass\n")
|
||||||
self.assertRaisesSyntaxError("def f(p1, *, None, **k1):\n pass\n")
|
self.assertRaisesSyntaxError("def f(p1, *, None, **k1):\n pass\n")
|
||||||
self.assertRaisesSyntaxError("def f(p, *, (k1, k2), **kw):\n pass\n")
|
self.assertRaisesSyntaxError("def f(p, *, (k1, k2), **kw):\n pass\n")
|
||||||
|
@ -144,13 +145,6 @@ class KeywordOnlyArgTestCase(unittest.TestCase):
|
||||||
except TypeError:
|
except TypeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def test_doublestar_only(self):
|
|
||||||
def f(*, **kw):
|
|
||||||
return kw
|
|
||||||
|
|
||||||
self.assertEqual(f(), {})
|
|
||||||
self.assertEqual(f(k1=1, k2=2), {'k1' : 1, 'k2' : 2})
|
|
||||||
|
|
||||||
def test_kwonly_methods(self):
|
def test_kwonly_methods(self):
|
||||||
class Example:
|
class Example:
|
||||||
def f(self, *, k1=1, k2=2):
|
def f(self, *, k1=1, k2=2):
|
||||||
|
|
11
Python/ast.c
11
Python/ast.c
|
@ -649,8 +649,12 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,
|
||||||
arg_ty arg;
|
arg_ty arg;
|
||||||
int i = start;
|
int i = start;
|
||||||
int j = 0; /* index for kwdefaults and kwonlyargs */
|
int j = 0; /* index for kwdefaults and kwonlyargs */
|
||||||
assert((kwonlyargs != NULL && kwdefaults != NULL) ||
|
|
||||||
TYPE(CHILD(n, i)) == DOUBLESTAR);
|
if (kwonlyargs == NULL) {
|
||||||
|
ast_error(CHILD(n, start), "named arguments must follow bare *");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
assert(kwdefaults != NULL);
|
||||||
while (i < NCH(n)) {
|
while (i < NCH(n)) {
|
||||||
ch = CHILD(n, i);
|
ch = CHILD(n, i);
|
||||||
switch (TYPE(ch)) {
|
switch (TYPE(ch)) {
|
||||||
|
@ -814,7 +818,8 @@ ast_for_arguments(struct compiling *c, const node *n)
|
||||||
break;
|
break;
|
||||||
case STAR:
|
case STAR:
|
||||||
if (i+1 >= NCH(n)) {
|
if (i+1 >= NCH(n)) {
|
||||||
ast_error(CHILD(n, i), "no name for vararg");
|
ast_error(CHILD(n, i),
|
||||||
|
"named arguments must follow bare *");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
ch = CHILD(n, i+1); /* tfpdef or COMMA */
|
ch = CHILD(n, i+1); /* tfpdef or COMMA */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue