# 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]
# 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 == '**'):
# 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)
# 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)
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]]""")
--- /dev/null
+lib2to3 now recognizes expressions after ``*`` and `**` like in ``f(*[] or
+[])``.