[Python-ideas] Make max() stable

David Mertz mertz at gnosis.cx
Tue Jan 21 22:11:58 CET 2014


Slightly related, here's an invariant that I've wished would hold for a
decade, but isn't likely to, even in Python 4:

  assert all(not x<y for x,y in zip(a,b)) if a==b else False

But this is just a question of inequality versus identity and that sets and
dictionaries are, IMO, too sloppy about that.  That is, they behave exactly
as documented and as the BDFL has decreed, but I still feel uneasy about:

  >>> a = {1, 1+0j, 2}
  >>> b = {1+0j, 1, 2}
  >>> a
  {(1+0j), 2}
  >>> b
  {1, 2}
  >>> a == b
  True


On Tue, Jan 21, 2014 at 1:02 PM, David Mertz <mertz at gnosis.cx> wrote:

> Imagine implementing min and max this way (ignoring key= and the
>> possibility of a single iterable arg):
>>
>> lst = sorted((x,y))
>> assert lst == [min(lst), max(lst)]
>>
>> will pass for any x and y.
>>
>
> Well, that's not possible, of course, if one is willing to be slightly
> perverse:
>
> >>> @total_ordering
> ... class SomewhatOrdered(object):
> ...     def __init__(self, val):
> ...         self.val = val
> ...     def __eq__(self, other):
> ...         return self.val == other.val
> ...     def __lt__(self, other):
> ...         return (self.val, random()) < (other.val, random())
> ...     def __repr__(self):
> ...         return repr(self.val)
> ...
> >>> x, y, z = map(SomewhatOrdered, (1, 1.0, 2))
>
> But even if you were slightly less perverse than this, *sets* (and
> set-like collections) return elements in indeterminate order which the
> language does not guarantee.  In particular, I do not think we are promised
> this holds:
>
>   assert tuple(a)==tuple(b) if a==b else False
>
> I can certainly construct a class where that won't hold (i.e. a set-like
> class that iterates in a non-deterministic order; this need not even be
> perverse, e.g. if it is 'AsyncResultsSet' that gets its data from I/O
> source or parallel computations).
>
> I have a feeling I could find plain old Python sets that would fail that,
> but I'm not sure about it.
>
> --
> Keeping medicines from the bloodstreams of the sick; food
> from the bellies of the hungry; books from the hands of the
> uneducated; technology from the underdeveloped; and putting
> advocates of freedom in prisons.  Intellectual property is
> to the 21st century what the slave trade was to the 16th.
>



-- 
Keeping medicines from the bloodstreams of the sick; food
from the bellies of the hungry; books from the hands of the
uneducated; technology from the underdeveloped; and putting
advocates of freedom in prisons.  Intellectual property is
to the 21st century what the slave trade was to the 16th.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20140121/695e03c3/attachment.html>


More information about the Python-ideas mailing list