]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #1573, second attempt:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Sun, 9 Dec 2007 21:49:48 +0000 (21:49 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Sun, 9 Dec 2007 21:49:48 +0000 (21:49 +0000)
"def f(*, **kw)" now raises a SyntaxError.

Lib/test/test_ast.py
Lib/test/test_keywordonlyarg.py
Python/ast.c

index 03a877bcd1c7aee4d6493924d7bf059d740d57b2..4883ed5f4db4f831aaf242b359da5b4db77faa84 100644 (file)
@@ -58,9 +58,6 @@ exec_tests = [
     "break",
     # Continue
     "continue",
-    # kw only funcs
-    "def f(*, kw=1): pass",
-    "def f(*, **kw): pass",
 ]
 
 # These are compiled through "single"
index eeda5473fa6965930788ca6f187383c91a5e03c3..e64a6cdd7ca1836fba3c43d06035622da2264059 100644 (file)
@@ -48,6 +48,7 @@ class KeywordOnlyArgTestCase(unittest.TestCase):
         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):\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(p, *, (k1, k2), **kw):\n  pass\n")
@@ -144,13 +145,6 @@ class KeywordOnlyArgTestCase(unittest.TestCase):
         except TypeError:
             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):
         class Example:
             def f(self, *, k1=1, k2=2):
index 0127281a4db73422df0b90ca34c7b3a308a59439..f32f5878af5e6c6a9d9ac2784dc6000136d0d190 100644 (file)
@@ -649,8 +649,12 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,
     arg_ty arg;
     int i = start;
     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)) {
         ch = CHILD(n, i);
         switch (TYPE(ch)) {
@@ -814,7 +818,8 @@ ast_for_arguments(struct compiling *c, const node *n)
                 break;
             case STAR:
                 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;
                 }
                 ch = CHILD(n, i+1);  /* tfpdef or COMMA */