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/