[Python-Dev] Tuple pack/unpack and the definition of AST Assign nodes

Nick Coghlan ncoghlan at gmail.com
Mon Jun 9 16:04:05 CEST 2008

Thomas Lee wrote:
> In porting one of the old peephole optimizations to the new AST compiler 
> I noticed something weird going on with the following code:
> a, b, c = 1, 2, 3
> Now, as you would expect this gets parsed into an Assign node. That 
> Assign node looks like the following:
> Assign.targets = [Tuple(Name(a), Name(b), Name(c))]
> Assign.value = Tuple(1, 2, 3)
> What's weird here is that Assign.targets is an asdl_seq ... why are we 
> wrapping the names in a Tuple() node? Shouldn't it look something more 
> like this:
> Assign.targets = [Name(a), Name(b), Name(c)]
> I understand that parsing the testlist might yield a tuple and it was 
> thus easier to just use the tuple rather than unpack it into an asdl_seq 
> ... but if this was the intention, then why is Assign.targets an expr* 
> rather than a plain old expr?

I haven't looked at that code recently, but I believe the ADSL sequence 
in the assignment node is for statements where there are actually 
multiple assignment targets, such as:

 >>> p = x, y = 1, 2
 >>> p, x, y
((1, 2), 1, 2)


Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia

More information about the Python-Dev mailing list