diff options
author | Ćukasz Langa <lukasz@langa.pl> | 2018-03-13 07:44:49 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-13 07:44:49 (GMT) |
commit | b51f5de71163f096d2d5229ede5379cdb284f651 (patch) | |
tree | 2e2cd21070d32c6000c68ad7143295f10685c75d | |
parent | a34510a4c562b4b23c7f9da6ff6e2318484f5f1a (diff) | |
download | cpython-b51f5de71163f096d2d5229ede5379cdb284f651.zip cpython-b51f5de71163f096d2d5229ede5379cdb284f651.tar.gz cpython-b51f5de71163f096d2d5229ede5379cdb284f651.tar.bz2 |
bpo-33064: lib2to3: support trailing comma after *args and **kwargs (#6096)
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).
-rw-r--r-- | Lib/lib2to3/Grammar.txt | 27 | ||||
-rw-r--r-- | Lib/lib2to3/tests/test_parser.py | 36 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2018-03-12-19-58-25.bpo-33064.LO2KIY.rst | 2 |
3 files changed, 39 insertions, 26 deletions
diff --git a/Lib/lib2to3/Grammar.txt b/Lib/lib2to3/Grammar.txt index 0bdfcaf..b19b4a2 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@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 0cbba26..cec2f98 100644 --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -9,7 +9,6 @@ test_grammar.py files from both Python 2 and Python 3. # 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 subprocess import sys import tempfile import unittest -import warnings # Local imports from lib2to3.pgen2 import driver as pgen2_driver @@ -305,6 +303,38 @@ class TestFunctionAnnotations(GrammarTest): *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 @@ class TestClassDef(GrammarTest): 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 0000000..c8e955e --- /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. |