[Python-Dev] Assign(expr* targets, expr value) - why targetS?

anatoly techtonik techtonik at gmail.com
Fri Nov 15 10:54:25 CET 2013


On Tue, Nov 12, 2013 at 5:08 PM, Benjamin Peterson <benjamin at python.org> wrote:
> 2013/11/12 anatoly techtonik <techtonik at gmail.com>:
>> On Sun, Nov 10, 2013 at 8:34 AM, Benjamin Peterson <benjamin at python.org> wrote:
>>> 2013/11/10 anatoly techtonik <techtonik at gmail.com>:
>>>> http://hg.python.org/cpython/file/1ee45eb6aab9/Parser/Python.asdl
>>>>
>>>> In Assign(expr* targets, expr value), why the first argument is a list?
>>>
>>> x = y = 42
>>
>> Thanks.
>>
>> Speaking of this ASDL. `expr* targets` means that multiple entities of
>> `expr` under the name 'targets' can be passed to Assign statement.
>> Assign uses them as left value. But `expr` definition contains things
>> that can not be used as left side assignment targets:
>>
>>     expr = BoolOp(boolop op, expr* values)
>>          | BinOp(expr left, operator op, expr right)
>>          ...
>>          | Str(string s) -- need to specify raw, unicode, etc?
>>          | Bytes(bytes s)
>>          | NameConstant(singleton value)
>>          | Ellipsis
>>
>>          -- the following expression can appear in assignment context
>>          | Attribute(expr value, identifier attr, expr_context ctx)
>>          | Subscript(expr value, slice slice, expr_context ctx)
>>          | Starred(expr value, expr_context ctx)
>>          | Name(identifier id, expr_context ctx)
>>          | List(expr* elts, expr_context ctx)
>>          | Tuple(expr* elts, expr_context ctx)
>>
>> If I understand correctly, this is compiled into C struct definitions
>> (Python-ast.c), and there is a code to traverse the structure, but
>> where is code that validates that the structure is correct? Is it done
>> on the first level - text file parsing, before ASDL is built? If so,
>> then what is the role of this ADSL exactly that the first step is
>> unable to solve?
>
> Only valid expression targets are allowed during AST construction. See
> set_expr_context in ast.c.

Oh my. Now there is also CST in addition to AST. This stuff -
http://docs.python.org/devguide/ - badly needs diagrams about data
transformation toolchain from Python source code to machine
execution instructions. I'd like some pretty stuff, but raw blogdiag
hack will do the job http://blockdiag.com/en/blockdiag/index.html

There is no set_expr_context in my copy of CPython code, which
seems to be some alpha of Python 3.4

>> Is it possible to fix ADSL to move `expr` that are allowed in Assign
>> into `expr` subset? What effect will it achieve? I mean - will ADSL
>> compiler complain about wrong stuff on the left side, or it will still
>> be a role of some other component. Which one?
>
> I'm not sure what you mean by an `expr` subset.

Transform this:

    expr = BoolOp(boolop op, expr* values)
         | BinOp(expr left, operator op, expr right)
         ...
         | Str(string s) -- need to specify raw, unicode, etc?
         | Bytes(bytes s)
         | NameConstant(singleton value)
         | Ellipsis

         -- the following expression can appear in assignment context
         | Attribute(expr value, identifier attr, expr_context ctx)
         | Subscript(expr value, slice slice, expr_context ctx)
         | Starred(expr value, expr_context ctx)
         | Name(identifier id, expr_context ctx)
         | List(expr* elts, expr_context ctx)
         | Tuple(expr* elts, expr_context ctx)

to this:

    expr = BoolOp(boolop op, expr* values)
         | BinOp(expr left, operator op, expr right)
         ...
         | Str(string s) -- need to specify raw, unicode, etc?
         | Bytes(bytes s)
         | NameConstant(singleton value)
         | Ellipsis

         -- the following expression can appear in assignment context
         | expr_asgn

     expr_asgn =
           Attribute(expr value, identifier attr, expr_context ctx)
         | Subscript(expr value, slice slice, expr_context ctx)
         | Starred(expr value, expr_context ctx)
         | Name(identifier id, expr_context ctx)
         | List(expr* elts, expr_context ctx)
         | Tuple(expr* elts, expr_context ctx)


More information about the Python-Dev mailing list