<div dir="ltr"><div><div><div><div>I can't believe this hasn't been brought up before, but searching the web, and python-ideas, and all the PEPs has found nothing (could be my lame google-fu), so here goes:<br><br></div>Recent python has moved toward a "key" function for customized sorting:<br><br></div>list.sort(key=key_fun)<br><br></div>key is also used (according to <a href="https://docs.python.org/3.6/library/functools.html#functools.cmp_to_key">https://docs.python.org/3.6/library/functools.html#functools.cmp_to_key</a>) in:<br><br></div><span style="color:rgb(34,34,34);font-family:"Lucida Grande",Arial,sans-serif;font-size:16px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:justify;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;display:inline;float:none"><span></span></span><span style="font-family:monospace,monospace">min(), max(), heapq.nlargest(), heapq.nsmallest(), itertools.groupby()</span><br><div><div><br><div><div><div>with this fairly broad use, it seems it's becoming a fairly universal protocol for ordering.<br><br></div><div>However, if you are writing a custom class, and want to make it "sortable", you need to define (some of) the total comparison operators, which presumably are then called O(n logn) number of times for comparisons when sorting.<br><br></div><div>Or provide a sort key function when you actually do the sorting, which requires some inside knowledge of the objects you are sorting.<br></div><div><br></div><div>But what if there was a sort key magic method: <br><br> <span style="font-family:monospace,monospace">__key__</span> or <span style="font-family:monospace,monospace">__sort_key__ </span>(or whatever)<br></div><div><br></div><div>that would be called by the sorting functions if:<br><br></div><div>no key function was specified<br></div><div><br>and<br></div><div><br>it exists<br><br></div><div>It seems this would provide a easy way to make custom classes sortable that would be nicer for end users (not writing key functions), and possibly more performant in the "usual" case.<br><br></div><div>In fact, it's striking me that there may well be classes that are defining the comparison magic methods not because they want the objects to "work" with the comparison operators, but because that want them to work with sort and min, and max, and...<br></div><div><br></div><div>hmm, perhaps a __key__ method could even be used by the comparison operators, though that could result in pretty weird results when comparing two different types.<br></div><div><br></div><div>So: has this already been brought up and rejected?<br><br></div><div>Am I imagining the performance benefits?<br><br></div><div>Is sorting-related functionally too special-case to deserve a protocol?<br><br></div><div>Thoughts?<br><br></div><div>-Chris<br></div><div><br><div>-- <br><div class="gmail_signature"><br>Christopher Barker, Ph.D.<br>Oceanographer<br><br>Emergency Response Division<br>NOAA/NOS/OR&R            (206) 526-6959   voice<br>7600 Sand Point Way NE   (206) 526-6329   fax<br>Seattle, WA  98115       (206) 526-6317   main reception<br><br><a href="mailto:Chris.Barker@noaa.gov" target="_blank">Chris.Barker@noaa.gov</a></div>
</div></div></div></div></div></div></div>