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

Benjamin Peterson benjamin at python.org
Fri Nov 22 13:29:47 CET 2013


2013/11/22 anatoly techtonik <techtonik at gmail.com>:
> On Fri, Nov 15, 2013 at 5:43 PM, Benjamin Peterson <benjamin at python.org> wrote:
>> 2013/11/15 anatoly techtonik <techtonik at gmail.com>:
>>> 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
>>
>> It's actually called set_context.
>
> Ok. So what is the process?
>
>  SOURCE --> TOKEN STREAM --> SENTENCE STREAM --> CST -->
> --> AST --> BYTECODE
>
> Is that right?

I don't know what sentence stream is, but otherwise looks right.



-- 
Regards,
Benjamin


More information about the Python-Dev mailing list