[Python-Dev] Assign(expr* targets, expr value) - why targetS?
anatoly techtonik
techtonik at gmail.com
Fri Nov 15 10:56:39 CET 2013
On Fri, Nov 15, 2013 at 12:54 PM, anatoly techtonik <techtonik at gmail.com> wrote:
> 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)
And also this:
| Assign(expr* targets, expr value)
to this:
| Assign(expr_asgn* targets, expr value)
More information about the Python-Dev
mailing list