summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZsolt Dollenstein <zsol.zsol@gmail.com>2019-10-24 06:19:07 (GMT)
committerMiss Skeleton (bot) <31488909+miss-islington@users.noreply.github.com>2019-10-24 06:19:07 (GMT)
commit96b06aefe23521b61e4e9cdd44f5d30b00c7eb95 (patch)
treecb3193c53116b83c483afae524b4c1015bf4e2af
parent3bbb6db545eff73ba4031bd9b8f2ef71b84c906e (diff)
downloadcpython-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.txt4
-rw-r--r--Lib/lib2to3/fixes/fix_apply.py4
-rw-r--r--Lib/lib2to3/fixes/fix_intern.py4
-rw-r--r--Lib/lib2to3/fixes/fix_reload.py4
-rw-r--r--Lib/lib2to3/tests/test_parser.py7
-rw-r--r--Misc/NEWS.d/next/Library/2018-04-24-13-18-48.bpo-33348.XaJDei.rst2
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
+[])``.