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

Eli Bendersky eliben at gmail.com
Fri Nov 22 18:05:28 CET 2013


On Fri, Nov 22, 2013 at 3:21 AM, anatoly techtonik <techtonik at gmail.com>wrote:

> 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?
>
> >>>> 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)
> >
> > I doubt ASDL will let you do that.
>
> asdl.py  is plain broken - wrong number of arguments passed to
>             output function
> asdl_c.py worked ok with fixed ASDL and generated - diff attached.
> I don't know what to check further - on Windows without Visual Studio.
> --
>

asdl.py is about to be replaced - please see
http://bugs.python.org/issue19655 - I'm waiting for after the 3.4 branch to
move forward with that.

Let's discuss any needed fixes in that issue.

Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20131122/fbc018eb/attachment.html>


More information about the Python-Dev mailing list