Tim Peters wrote:
Because you never _need_ to use an assignment expression to write a
listcomp/genexp.

This whole discussion started because someone wanted a way
to bind a temporary result for use *within* a comprehension.
Those use cases don't require leakage.

Otherwise it's essentially impossible to explain why:

    total = 0
    sums = [total := total + value for value in data]
    assert sums[-1] == total

"blows up", despite that its intent is obvious,unless you first
explain to a user how the listcomp is implemented via an invisible
synthetic function created by magic, inside of which `total`  has
nothing to do with the `total` they see on the first line.

It's no harder to explain that than it is to explain
why

   x = 42
   y = [x * x for x in range(5)]
   print(x)

prints 42 rather than whatever value was last bound to
the x in the comprehension.

Seems to me it would be easier to explain that *all* names
bound within a comprehension are local to the comprehension,
than to have to say that some are and some aren't.

--
Greg



UnboundLocalError - WTF?

That's why leaking "is good".  It works both directions:  the outer
name leaks _into_ the body too, not just _out_ of it.  Things that
"look like" they should obviously work do work then, and a user can
remain blissfully unaware of the implementation.. Of course you can
also find cases in which it's not wanted.

If it doesn't leak the kind of use shown above can't be done at all
via listcomps (at least not straightforwardly).

If it does leak, the subset of cases where leaking is unwanted _of_
the subset of cases in which a listcomp//genexp uses an assignment
expression at all are indeed inconvenienced.

So - surprise!  It's a tradeoff, something we've never faced before ;-)

_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to