On Sun, May 13, 2018 at 1:34 AM, Andre Roberge <andre.robe...@gmail.com>
wrote:

> First example: single temporary assignment, done four different ways.
>
> 1) using :=
>
> real_roots = [ (-b/(2*a) + (D:= sqrt( (b/(2*a))**2 - c/a), -b/(2*a) - D)
>                          for a in range(10)
>                          for b in range(10)
>                          for c in range(10)
>                          if D >= 0]
>

Unless PEP 572 is doing something horribly magical, this doesn't look as
though it should work at all, so it may not be a good target for
comparisons with other syntax possibilities. I'd expect that the `D` name
lookup in the `if D >= 0` clause would occur before the (D := ...)
assignment in the target expression, resulting in an UnboundLocalError. (I
tried to check out Chris's reference implementation branch to verify, but
the compilation failed with a traceback.)

And a random mathematical nitpick: as a non-NaN result of a square root
operation, D will always satisfy D >= 0; for this use-case we want to check
the *argument* to the `sqrt` call for nonnegativity, rather than the
*result*. So I think the target statement for the comparison with other
syntaxes should look something like this instead:

    real_roots = [
        (-b/(2*a) + sqrt(D), -b/(2*a) - sqrt(D))
        for a in range(1, 10)  # start at 1 to avoid division by zero
        for b in range(10)
        for c in range(10)
        if (D := (b/(2*a))**2 - c/a) >= 0
    ]

Or possibly like this, using an extra assignment expression to avoid the
repeated computation of the square root:

    real_roots = [
        (-b/(2*a) + (s := sqrt(D)), -b/(2*a) - s)
        for a in range(1, 10)
        for b in range(10)
        for c in range(10)
        if (D := (b/(2*a))**2 - c/a) >= 0
    ]

Similar order-of-evaluation issues apply to example (8), and to the other
examples based on hypothetical syntax, depending on exactly how that syntax
is hypothesised to work.

-- 
Mark
_______________________________________________
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