[Python-checkins] bpo-33064: lib2to3: support trailing comma after *args and **kwargs (GH-6096) (#6097)
Łukasz Langa
webhook-mailer at python.org
Tue Mar 13 04:08:07 EDT 2018
https://github.com/python/cpython/commit/b4c8871ca43d37be167ef5dbe9fb341922c04a9f
commit: b4c8871ca43d37be167ef5dbe9fb341922c04a9f
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: Łukasz Langa <lukasz at langa.pl>
date: 2018-03-13T01:08:02-07:00
summary:
bpo-33064: lib2to3: support trailing comma after *args and **kwargs (GH-6096) (#6097)
New tests also added.
I also made the comments in line with the builtin Grammar/Grammar. PEP 306 was
withdrawn, Kees Blom's railroad program has been lost to the sands of time for
at least 16 years now (I found a python-dev post from people looking for it).
(cherry picked from commit b51f5de71163f096d2d5229ede5379cdb284f651)
Co-authored-by: Łukasz Langa <lukasz at langa.pl>
files:
A Misc/NEWS.d/next/Library/2018-03-12-19-58-25.bpo-33064.LO2KIY.rst
M Lib/lib2to3/Grammar.txt
M Lib/lib2to3/tests/test_parser.py
diff --git a/Lib/lib2to3/Grammar.txt b/Lib/lib2to3/Grammar.txt
index 0bdfcafcf3ca..b19b4a21fadd 100644
--- a/Lib/lib2to3/Grammar.txt
+++ b/Lib/lib2to3/Grammar.txt
@@ -1,26 +1,7 @@
# Grammar for 2to3. This grammar supports Python 2.x and 3.x.
-# Note: Changing the grammar specified in this file will most likely
-# require corresponding changes in the parser module
-# (../Modules/parsermodule.c). If you can't make the changes to
-# that module yourself, please co-ordinate the required changes
-# with someone who can; ask around on python-dev for help. Fred
-# Drake <fdrake at acm.org> will probably be listening there.
-
-# NOTE WELL: You should also follow all the steps listed in PEP 306,
-# "How to Change Python's Grammar"
-
-# Commands for Kees Blom's railroad program
-#diagram:token NAME
-#diagram:token NUMBER
-#diagram:token STRING
-#diagram:token NEWLINE
-#diagram:token ENDMARKER
-#diagram:token INDENT
-#diagram:output\input python.bla
-#diagram:token DEDENT
-#diagram:output\textwidth 20.04cm\oddsidemargin 0.0cm\evensidemargin 0.0cm
-#diagram:rules
+# NOTE WELL: You should also follow all the steps listed at
+# https://devguide.python.org/grammar/
# Start symbols for the grammar:
# file_input is a module or sequence of commands read from an input file;
@@ -38,13 +19,13 @@ async_funcdef: 'async' funcdef
funcdef: 'def' NAME parameters ['->' test] ':' suite
parameters: '(' [typedargslist] ')'
typedargslist: ((tfpdef ['=' test] ',')*
- ('*' [tname] (',' tname ['=' test])* [',' '**' tname] | '**' tname)
+ ('*' [tname] (',' tname ['=' test])* [',' ['**' tname [',']]] | '**' tname [','])
| tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
tname: NAME [':' test]
tfpdef: tname | '(' tfplist ')'
tfplist: tfpdef (',' tfpdef)* [',']
varargslist: ((vfpdef ['=' test] ',')*
- ('*' [vname] (',' vname ['=' test])* [',' '**' vname] | '**' vname)
+ ('*' [vname] (',' vname ['=' test])* [',' ['**' vname [',']]] | '**' vname [','])
| vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
vname: NAME
vfpdef: vname | '(' vfplist ')'
diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py
index 0cbba26bec04..cec2f98e9665 100644
--- a/Lib/lib2to3/tests/test_parser.py
+++ b/Lib/lib2to3/tests/test_parser.py
@@ -9,7 +9,6 @@
# Testing imports
from . import support
from .support import driver, driver_no_print_statement
-from test.support import verbose
# Python imports
import difflib
@@ -22,7 +21,6 @@
import sys
import tempfile
import unittest
-import warnings
# Local imports
from lib2to3.pgen2 import driver as pgen2_driver
@@ -305,6 +303,38 @@ def test_8(self):
*g:6, h:7, i=8, j:9=10, **k:11) -> 12: pass"""
self.validate(s)
+ def test_9(self):
+ s = """def f(
+ a: str,
+ b: int,
+ *,
+ c: bool = False,
+ **kwargs,
+ ) -> None:
+ call(c=c, **kwargs,)"""
+ self.validate(s)
+
+ def test_10(self):
+ s = """def f(
+ a: str,
+ ) -> None:
+ call(a,)"""
+ self.validate(s)
+
+ def test_11(self):
+ s = """def f(
+ a: str = '',
+ ) -> None:
+ call(a=a,)"""
+ self.validate(s)
+
+ def test_12(self):
+ s = """def f(
+ *args: str,
+ ) -> None:
+ call(*args,)"""
+ self.validate(s)
+
# Adapted from Python 3's Lib/test/test_grammar.py:GrammarTests.test_var_annot
class TestVarAnnotations(GrammarTest):
@@ -407,7 +437,7 @@ def test_new_syntax(self):
self.validate("class B(t, *args): pass")
self.validate("class B(t, **kwargs): pass")
self.validate("class B(t, *args, **kwargs): pass")
- self.validate("class B(t, y=9, *args, **kwargs): pass")
+ self.validate("class B(t, y=9, *args, **kwargs,): pass")
class TestParserIdempotency(support.TestCase):
diff --git a/Misc/NEWS.d/next/Library/2018-03-12-19-58-25.bpo-33064.LO2KIY.rst b/Misc/NEWS.d/next/Library/2018-03-12-19-58-25.bpo-33064.LO2KIY.rst
new file mode 100644
index 000000000000..c8e955e335cb
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-03-12-19-58-25.bpo-33064.LO2KIY.rst
@@ -0,0 +1,2 @@
+lib2to3 now properly supports trailing commas after ``*args`` and
+``**kwargs`` in function signatures.
More information about the Python-checkins
mailing list