> > 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 <st...@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@python.org > https://mail.python.org/mailman/listinfo/python-ideas > Code of Conduct: http://python.org/psf/codeofconduct/ >
_______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/