Proposal: min(None, x) and max(None, x) return x

holger krekel pyth at devel.trillke.net
Sat Nov 23 12:26:00 EST 2002


Bengt Richter wrote:
> On Fri, 22 Nov 2002 14:53:42 GMT, Andrew Koenig <ark at research.att.com> wrote:
> 
> >Eric> So I told myself: wouldn't it be great if max(None, x) or
> >Eric> min(None, x) always simply returned x?
> >
> >My first thought was that this was an excellent idea.
> >
> >Then I thought again.
> >
> >Here's the problem:  The notion that max(None, x) and min(None, x)
> >should both return x is one of three desirable properties that cannot
> >all be true at once.  Here are the other two:
> >
> >        1) Whenever x < y, min(x, y) is x and max(x, y) is y.
> >
> >        2) < is an order relation over all types.
> >
> >The desirability of (1) should be obvious.  (2) is more subtle, but
> >it is necessary for it to be possible to sort a vector of heterogenously
> >typed objects.
> >
> >Now, if max(None, x) and min(None, x) both yield x, and (1) is true,
> >then x > None and x < None must both be true.  But then (2) cannot
> >be true.
> >
> >So the cost of your proposal would be either to break the consistency
> >between max/min and >/<, or to render unsortable vectors of values
> >that include None.
> >
> >I don't think it's worth it.
> >
> How about adding optional keyword args to min and max, so the semantics
> would be something like (not very tested ;-):
> 
>  >>> class private_sentinel: pass
>  ...
>  >>> def mymax(*seq, **kw):
>  ...     exclude = kw.get('exclude', private_sentinel)
>  ...     empty = kw.get('empty', private_sentinel)
>  ...     try:
>  ...         return max(filter(lambda x: not isinstance(x, exclude), seq))
>  ...     except ValueError:
>  ...         if empty == private_sentinel: raise
>  ...         return empty
>  ...
>  >>> mymax(None, 2, 3)
>  3
>  >>> mymax(None, 2, 3, exclude=(int,type(None)),empty='nothing left')
>  'nothing left'
>  >>> mymax(None, 2, 3,'a string', exclude=(int,type(None)),empty='nothing left')
>  'a string'
> 
> (oops, that 'if empty == ...' would have been better as 'if empty is ...')

I like this idea! Maybe the common case should be writable as

    mymax(x, y , exclude=None)

and it doesn't introduce significant backward compatibility issues.

regards,

    holger




More information about the Python-list mailing list