[Python-ideas] 'default' keyword argument for max(), min()

Steven D'Aprano steve at pearwood.info
Thu Apr 16 14:09:12 CEST 2009


On Thu, 16 Apr 2009 07:10:52 pm Arnaud Delobelle wrote:
> On 16 Apr 2009, at 04:39, Jared Grubb wrote:
> > def min2(*vars, **kw):
> >     try:
> >         if 'key' in kw:
> >              return min(*vars, key=kw['key'])
> >         return min(*vars)
> >     except Exception:
> >         if 'default' in kw:
> >             return kw['default']
> >         raise
>
> Nitpick:

I don't think pointing out that the proposed behaviour inappropriately 
swallows random exceptions is a nitpick. I think it's a valuable 
service :)

I think it is vital that min() and max() don't hide bugs by swallowing 
all exceptions. Here's my go at a pure Python version:


SENTINEL = object()

def is_iterable(obj):
    try:
        iter(obj)
    except TypeError:
        return False
    return True

def min(*vars, key=None, default=SENTINEL):
    if len(vars) == 1:
        if is_iterable(vars):
            vars = iter(vars[0])
        else:
            raise TypeError
    try:
        smallest = vars.next()
    except StopIteration:
        if default is SENTINEL:
            raise ValueError
        else:
            return default
    if key is not None:
        smallest = key(smallest)
    for value in vars:
        if key is not None:
            value = key(value)
        if value < smallest:
            smallest = vars
    return smallest





-- 
Steven D'Aprano



More information about the Python-ideas mailing list