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