<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Wed, Jun 27, 2018 at 7:30 AM Steven D'Aprano <<a href="mailto:steve@pearwood.info">steve@pearwood.info</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Wed, Jun 27, 2018 at 06:52:14AM -0700, Michael Selik wrote:<br>
> > > Have you ever written ``max(range(x))`` in production code?<br>
> > I have never written that.<br>
> > But I have written ``max(iterable)`` dozens of times, where iterable<br>
> > could be a range object.<br>
> ><br>
> My intent was to ask where a range was in fact passed into max, not merely<br>
> where it could be. It'd be enlightening to see a complete, realistic<br>
> example.<br>
<br>
A complete, realistic example is as I said: you call max() on some <br>
object which you don't control, the caller does. You could be <br>
passed a list, or a set, or a bitset, a binary search tree, a range <br>
object, whatever the caller happens to pass to you.<br></blockquote><div><br></div><div>This is not a complete, realistic example. You're describing what an example might be, but not providing a concrete one with context.</div><div><br></div><div>Quoting Guido from earlier in the thread: "<span style="color:rgb(33,33,33);font-size:13px">I think just finding a data structure that should implement its own min/max funtionality (or maybe one of these, like heapq) is not enough motivation. You have to find code where such a data structure (let's say a Tree) is passed to some function that also accepts, say, a list."</span></div><div><br></div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Imagine that Python's len() always walked the entire iterable, from <br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
start to end, to count the length. Now suppose that you proposed <br>
adding a __len__ protocol so that objects that know their own length <br>
can report it quickly, and in response I argued that<br>
    len(range(x))<br>
was unrealistic and that there is no need for a __len__ method <br>
because we could just say <br>
    range(x).stop<br>
instead. I don't think you would find that argument very persuasive, <br>
would you?<br></blockquote><div><br></div><div>I would, actually. The range object is particularly unpersuasive as a motivation for magic methods, because of its unusual usage. The hypothetical Tree object discussed earlier was much more interesting.</div></div></div>