[Python-ideas] Add dict.getkey() and set.get()

Terry Reedy tjreedy at udel.edu
Sat Sep 14 19:56:25 CEST 2013


On 9/14/2013 1:04 PM, David Mertz wrote:
> Perhaps being pedantic, but there is not necessarily ONE key in the
> original collection which is equal to the search value:

Sets presume that == is an equivalence relation. When that is not true, 
as for such FuzzyNumbers (which break transitivity), they should not be 
used with sets at all, as many operations will be somewhat broken. For 
one thing, the composition of such 'sets' will depend on the order of 
addition.

>  >>> d = {2: 'a', 5.0: 'b', 7.2: 'low', 7.6: 'high'}
>  >>> class FuzzyNumber(float):
> ...     def __eq__(self, other):
> ...         return abs(self-other) < 0.5

Better to call this method 'similar' or 'is_similar', since similarity 
is not expected to be transitive.

>  >>> fn = FuzzyNumber(7.5)
>  >>> getexact(d, fn) # What gets returned here?!
> 7.6
>
> ANY implementation of this idea would either have to pick the arbitrary
> first match, or ... well, something else.  Equality isn't actually
> transitive across all Python objects...

Except for NaNs, the non-floats called floats for the benefit of 
languages with typed operations, I believe equality is (at least as far 
as possible) transitive for the built-in classes as delivered. We fixed
   0.0 == 0 == Decimal(0) != 0.0
because of the problems caused by the non-transitivity. Avoiding 
breaking transitivity was one of the design constraints of the Enums.

 > and even my quick example isn't
> a completely absurd data type (it would need to be fleshed out better,
> but a FuzzyNumber could well have sensible purposes).

The only absurd thing is calling similarity 'equality' ;=).

-- 
Terry Jan Reedy



More information about the Python-ideas mailing list