[Python-Dev] Examples for PEP 572

Serhiy Storchaka storchaka at gmail.com
Wed Jul 4 04:54:34 EDT 2018


04.07.18 10:06, Tim Peters пише:
> [Tim]
>  >> I really don't know what Guido likes best about this, but for me it's
> 
>  >> the large number of objectively small wins in `if` and `while`
> 
>  >> contexts.   They add up.  That conclusion surprised me.  That there are
> 
>  >> occasionally bigger wins to be had is pure gravy.
> 
> 
> [Serhiy Storchaka]
>  > Could you please show me several examples in real code? I
>  > have not seen any win yet.
> 
> My PEP Appendix was derived entirely from looking at real code.  If you 
> don't believe the examples I showed there are wins (and I don't know 
> whether you've seen them, because your original message in this thread 
> only echoed examples from the body of the PEP), then what we each mean 
> by "win" in this context has no intersection, so discussing it would be 
> futile (for both of us).

Sorry, this PEP was rewritten so many times that I missed your Appendix.

> while total != (total := total + term):
>     term *= mx2 / (i*(i+1))
>     i += 2
> return total

This code looks clever that the original while loop with a break in a 
middle. I like clever code. But it needs more mental efforts for 
understanding it.

I admit that this is a good example.

There is a tiny problem with it (and with rewriting a while loop as a 
for loop, as I like). Often the body contains not a single break. In 
this case the large part of cleverness is disappeared. :-(

> if result := solution(xs, n):
>     # use result

It looks equally clear with the original code. This is not enough for 
introducing a new syntax.

> if reductor := dispatch_table.get(cls):
>     rv = reductor(x)
> elif reductor := getattr(x, "__reduce_ex__", None):
>     rv = reductor(4)
> elif reductor := getattr(x, "__reduce__", None):
>     rv = reductor()
> else:
>     raise Error("un(shallow)copyable object of type %s" % cls)

I was going to rewrite this code as

     reductor = dispatch_table.get(cls)
     if reductor:
         rv = reductor(x)
     else:
         rv = x.__reduce_ex__(4)

There were reasons for the current complex code in Python 2, but now 
classic classes are gone, and every class has the __reduce_ex__ method 
which by default calls __reduce__ which by default is inherited from 
object. With that simplification the benefit of using ":=" in this 
example looks less impressed.

> if (diff := x - x_base) and (g := gcd(diff, n)) > 1:
>     return g

> while a > (d := x // a**(n-1)):
>     a = ((n-1)*a + d) // n
> return a

I would have a fun writing such code. As well as I believe you had a fun 
writing it. But I suppose the original code is simpler for a casual 
reader, and I will refrain from using such code in a project maintained 
by other people (in particular in the Python stdlib).

> Which is what I expect:  the treatment you gave to the examples from the 
> body of the PEP suggests you're determined not to acknowledge any "win", 
> however small.

I have to admit that *there are* examples that can have a small win. I 
wondering why your examples are not used in the PEP body instead of 
examples which play *against* PEP 572.

Yet a win too small to me for justifying such syntax change. I know that 
I can not convince you or Guido.



More information about the Python-Dev mailing list