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

Nick Coghlan ncoghlan at gmail.com
Tue Jun 10 13:04:32 CEST 2008


Thomas Lee wrote:
> Nick Coghlan wrote:
>>
>> 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)
>>
>> Cheers,
>> Nick.
>>
> Ah I see. A quick test verifies exactly this:
> 
>    >>> import _ast
>    >>> ast = compile("p = x, y = 1, 2", "<string>", "exec", 
> _ast.PyCF_ONLY_AST)
>    >>> ast.body[0]
>    <_ast.Assign object at 0xb7d0122c>
>    >>> ast.body[0].targets
>    [<_ast.Name object at 0xb7d0124c>, <_ast.Tuple object at 0xb7d0128c>]
>    >>> ast.body[0].value
>    <_ast.Tuple object at 0xb7d0132c>
>    >>>
> 
> I thought this would have been implemented as nested Assign nodes, but 
> I'm obviously wrong. :) Thanks for the clarification.

It's one of the key differences between Python's "assignment as a 
statement" and C-style "assignment as an expression" - nested Assignment 
nodes are meaningful with the latter approach, but nonsensical with the 
way Python defines assignment (the rightmost expression is evaluated 
once and then assigned to each of the target expressions from left to 
right).

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org


More information about the Python-Dev mailing list