@@ -326,11 +326,11 @@ def visit_Try(self, node):
326
326
327
327
return ControlFlowNode (try_node , last_statements , break_statements = body .break_statements )
328
328
329
- def assign_tuple_target (self , node , right_hand_side_variables ):
329
+ def assign_tuple_target (self , target_nodes , value_nodes , right_hand_side_variables ):
330
330
new_assignment_nodes = []
331
331
remaining_variables = list (right_hand_side_variables )
332
- remaining_targets = list (node . targets [ 0 ]. elts )
333
- remaining_values = list (node . value . elts ) # May contain duplicates
332
+ remaining_targets = list (target_nodes )
333
+ remaining_values = list (value_nodes ) # May contain duplicates
334
334
335
335
def visit (target , value ):
336
336
label = LabelVisitor ()
@@ -339,7 +339,7 @@ def visit(target, value):
339
339
rhs_visitor .visit (value )
340
340
if isinstance (value , ast .Call ):
341
341
new_ast_node = ast .Assign (target , value )
342
- ast .copy_location (new_ast_node , node )
342
+ ast .copy_location (new_ast_node , target )
343
343
new_assignment_nodes .append (self .assignment_call_node (label .result , new_ast_node ))
344
344
else :
345
345
label .result += ' = '
@@ -349,7 +349,7 @@ def visit(target, value):
349
349
extract_left_hand_side (target ),
350
350
ast .Assign (target , value ),
351
351
rhs_visitor .result ,
352
- line_number = node .lineno ,
352
+ line_number = target .lineno ,
353
353
path = self .filenames [- 1 ]
354
354
)))
355
355
remaining_targets .remove (target )
@@ -358,7 +358,7 @@ def visit(target, value):
358
358
remaining_variables .remove (var )
359
359
360
360
# Pair targets and values until a Starred node is reached
361
- for target , value in zip (node . targets [ 0 ]. elts , node . value . elts ):
361
+ for target , value in zip (target_nodes , value_nodes ):
362
362
if isinstance (target , ast .Starred ) or isinstance (value , ast .Starred ):
363
363
break
364
364
visit (target , value )
@@ -380,7 +380,7 @@ def visit(target, value):
380
380
extract_left_hand_side (target ),
381
381
ast .Assign (target , remaining_values [0 ]),
382
382
remaining_variables ,
383
- line_number = node .lineno ,
383
+ line_number = target .lineno ,
384
384
path = self .filenames [- 1 ]
385
385
)))
386
386
@@ -413,14 +413,18 @@ def visit_Assign(self, node):
413
413
rhs_visitor .visit (node .value )
414
414
if isinstance (node .targets [0 ], (ast .Tuple , ast .List )): # x,y = [1,2]
415
415
if isinstance (node .value , (ast .Tuple , ast .List )):
416
- return self .assign_tuple_target (node , rhs_visitor .result )
416
+ return self .assign_tuple_target (node . targets [ 0 ]. elts , node . value . elts , rhs_visitor .result )
417
417
elif isinstance (node .value , ast .Call ):
418
418
call = None
419
419
for element in node .targets [0 ].elts :
420
420
label = LabelVisitor ()
421
421
label .visit (element )
422
422
call = self .assignment_call_node (label .result , node )
423
423
return call
424
+ elif isinstance (node .value , ast .Name ): # Treat `x, y = z` like `x, y = (*z,)`
425
+ value_node = ast .Starred (node .value , ast .Load ())
426
+ ast .copy_location (value_node , node )
427
+ return self .assign_tuple_target (node .targets [0 ].elts , [value_node ], rhs_visitor .result )
424
428
else :
425
429
label = LabelVisitor ()
426
430
label .visit (node )
0 commit comments