diff options
author | Zsolt Dollenstein <zsol.zsol@gmail.com> | 2019-10-24 06:19:07 (GMT) |
---|---|---|
committer | Miss Skeleton (bot) <31488909+miss-islington@users.noreply.github.com> | 2019-10-24 06:19:07 (GMT) |
commit | 96b06aefe23521b61e4e9cdd44f5d30b00c7eb95 (patch) | |
tree | cb3193c53116b83c483afae524b4c1015bf4e2af | |
parent | 3bbb6db545eff73ba4031bd9b8f2ef71b84c906e (diff) | |
download | cpython-96b06aefe23521b61e4e9cdd44f5d30b00c7eb95.zip cpython-96b06aefe23521b61e4e9cdd44f5d30b00c7eb95.tar.gz cpython-96b06aefe23521b61e4e9cdd44f5d30b00c7eb95.tar.bz2 |
bpo-33348: parse expressions after * and ** in lib2to3 (GH-6586)
These are valid even in python 2.7
https://bugs.python.org/issue33348
Automerge-Triggered-By: @gpshead
-rw-r--r-- | Lib/lib2to3/Grammar.txt | 4 | ||||
-rw-r--r-- | Lib/lib2to3/fixes/fix_apply.py | 4 | ||||
-rw-r--r-- | Lib/lib2to3/fixes/fix_intern.py | 4 | ||||
-rw-r--r-- | Lib/lib2to3/fixes/fix_reload.py | 4 | ||||
-rw-r--r-- | Lib/lib2to3/tests/test_parser.py | 7 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2018-04-24-13-18-48.bpo-33348.XaJDei.rst | 2 |
6 files changed, 14 insertions, 11 deletions
diff --git a/Lib/lib2to3/Grammar.txt b/Lib/lib2to3/Grammar.txt index a7ddad3..68b7386 100644 --- a/Lib/lib2to3/Grammar.txt +++ b/Lib/lib2to3/Grammar.txt @@ -138,8 +138,8 @@ arglist: argument (',' argument)* [','] # that precede iterable unpackings are blocked; etc. argument: ( test [comp_for] | test '=' test | - '**' expr | - star_expr ) + '**' test | + '*' test ) comp_iter: comp_for | comp_if comp_for: [ASYNC] 'for' exprlist 'in' testlist_safe [comp_iter] diff --git a/Lib/lib2to3/fixes/fix_apply.py b/Lib/lib2to3/fixes/fix_apply.py index 826ec8c..6408582 100644 --- a/Lib/lib2to3/fixes/fix_apply.py +++ b/Lib/lib2to3/fixes/fix_apply.py @@ -37,10 +37,8 @@ class FixApply(fixer_base.BaseFix): # I feel like we should be able to express this logic in the # PATTERN above but I don't know how to do it so... if args: - if args.type == self.syms.star_expr: - return # Make no change. if (args.type == self.syms.argument and - args.children[0].value == '**'): + args.children[0].value in {'**', '*'}): return # Make no change. if kwds and (kwds.type == self.syms.argument and kwds.children[0].value == '**'): diff --git a/Lib/lib2to3/fixes/fix_intern.py b/Lib/lib2to3/fixes/fix_intern.py index a852330..d752843 100644 --- a/Lib/lib2to3/fixes/fix_intern.py +++ b/Lib/lib2to3/fixes/fix_intern.py @@ -30,10 +30,8 @@ class FixIntern(fixer_base.BaseFix): # PATTERN above but I don't know how to do it so... obj = results['obj'] if obj: - if obj.type == self.syms.star_expr: - return # Make no change. if (obj.type == self.syms.argument and - obj.children[0].value == '**'): + obj.children[0].value in {'**', '*'}): return # Make no change. names = ('sys', 'intern') new = ImportAndCall(node, results, names) diff --git a/Lib/lib2to3/fixes/fix_reload.py b/Lib/lib2to3/fixes/fix_reload.py index 6c7fbbd..b308411 100644 --- a/Lib/lib2to3/fixes/fix_reload.py +++ b/Lib/lib2to3/fixes/fix_reload.py @@ -27,10 +27,8 @@ class FixReload(fixer_base.BaseFix): # PATTERN above but I don't know how to do it so... obj = results['obj'] if obj: - if obj.type == self.syms.star_expr: - return # Make no change. if (obj.type == self.syms.argument and - obj.children[0].value == '**'): + obj.children[0].value in {'**', '*'}): return # Make no change. names = ('importlib', 'reload') new = ImportAndCall(node, results, names) diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py index f22d399..a0c31e8 100644 --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -253,6 +253,13 @@ class TestUnpackingGeneralizations(GrammarTest): def test_double_star_dict_literal_after_keywords(self): self.validate("""func(spam='fried', **{'eggs':'scrambled'})""") + def test_double_star_expression(self): + self.validate("""func(**{'a':2} or {})""") + self.validate("""func(**() or {})""") + + def test_star_expression(self): + self.validate("""func(*[] or [2])""") + def test_list_display(self): self.validate("""[*{2}, 3, *[4]]""") diff --git a/Misc/NEWS.d/next/Library/2018-04-24-13-18-48.bpo-33348.XaJDei.rst b/Misc/NEWS.d/next/Library/2018-04-24-13-18-48.bpo-33348.XaJDei.rst new file mode 100644 index 0000000..f95a73f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-04-24-13-18-48.bpo-33348.XaJDei.rst @@ -0,0 +1,2 @@ +lib2to3 now recognizes expressions after ``*`` and `**` like in ``f(*[] or +[])``. |