[Python-ideas] A real life example of "given"

Peter O'Connor peter.ed.oconnor at gmail.com
Wed May 30 11:23:21 EDT 2018


>
>  In comparison, I think that := is much simpler.


In this case that's true, but a small modification:

        updates = {
            y: do_something_to(potential_update)
            for x in need_initialization_nodes
            for y in [x, *x.synthetic_inputs()]
            if potential_update is not None
            given potential_update = command.create_potential_update(y)
            }

Shows the flexibility of this given syntax vs ":="

If we think of "given" as just inserting a line with variable-definitions
before the preceding statement, it seems clear that:

        updates = {
            y: potential_update
            given potential_update = command.create_potential_update(y)
            for x in need_initialization_nodes
            for y in [x, *x.synthetic_inputs()]
            if potential_update is not None
            }

Should raise a NameError: name 'potential_update' is not defined, and

        updates = {
            y: potential_update
            for x in need_initialization_nodes
            for y in [x, *x.synthetic_inputs()]
            given potential_update = command.create_potential_update(y)
            if potential_update is not None
            }


Should raise a NameError: name 'y' is not defined.

For safety it seems reasonable that if a variable is "given" in a
comprehension, trying to refer to it (even if it defined in the enclosing
scope) before the inner-definition will result in a NameError.


On Wed, May 30, 2018 at 2:22 PM, Steven D'Aprano <steve at pearwood.info>
wrote:

> On Wed, May 30, 2018 at 02:42:21AM -0700, Neil Girdhar wrote:
>
> > With "given", I can write:
> >
> >         potential_updates = {
> >             y: potential_update
> >             for x in need_initialization_nodes
> >             for y in [x, *x.synthetic_inputs()]
> >             given potential_update = command.create_potential_update(y)
> >             if potential_update is not None}
>
> I'm not sure if that would be legal for the "given" syntax. As I
> understand it, the "given" syntax is:
>
>     expression given name = another_expression
>
> but you've got half of the comprehension stuffed in the gap between the
> leading expression and the "given" keyword:
>
>     expression COMPREH- given name = another_expression -ENSION
>
> so I think that's going to be illegal.
>
>
> I think it wants to be written this way:
>
>         potential_updates = {
>             y: potential_update
>             for x in need_initialization_nodes
>             for y in [x, *x.synthetic_inputs()]
>             if potential_update is not None
>             given potential_update = command.create_potential_update(y)
>             }
>
>
> Or maybe it should be this?
>
>         potential_updates = {
>             y: potential_update
>             given potential_update = command.create_potential_update(y)
>             for x in need_initialization_nodes
>             for y in [x, *x.synthetic_inputs()]
>             if potential_update is not None
>             }
>
>
> I'm damned if I know which way is correct. Either of them? Neither?
>
> In comparison, I think that := is much simpler. There's only one place
> it can go:
>
>         potential_updates = {
>             y: potential_update
>             for x in need_initialization_nodes
>             for y in [x, *x.synthetic_inputs()]
>             if (
>                 potential_update := command.create_potential_update(y)
>                ) is not None
>             }
>
>
> --
> Steve
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180530/b3b83cd5/attachment-0001.html>


More information about the Python-ideas mailing list