[Python-ideas] Fwd: quantifications, and tuple patterns
Nick Coghlan
ncoghlan at gmail.com
Sun Jan 15 03:36:22 CET 2012
On Sun, Jan 15, 2012 at 12:01 PM, Steven D'Aprano <steve at pearwood.info> wrote:
> One disadvantage of returning a single value to represent both the success
> or failure of the quantification *and* the witness is that it leaves the
> caller vulnerable to this sort of bug:
>
> py> witness = any2([3, 0, 2, 4], lambda n: n%2==0) # get first even number
> py> if witness:
> ... print("first even number is,", witness)
> ... else:
> ... print("everything is odd")
> ...
> everything is odd
>
>
> I don't have a good solution for this.
The way around it is to always return a tuple: empty if no answer was
found, a singleton-tuple if it was. That way truth-testing will always
give the right found/not-found answer, but in the found case you can
access the original object.
def any2(iterable, pred=bool):
"""Like any(pred(x) for x in iterable), but returns () if nothing
matches the predicate,
otherwise (obj,), a singleton-tuple holding the first value that matched it.
"""
for obj in iterable:
if pred(obj):
return (obj,)
return ()
py> found = any2([3, 0, 2, 4], lambda n: n%2==0) # get first even number
py> if found:
... print("first even number is,", found[0])
... else:
... print("everything is odd")
...
first even number is 0
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
More information about the Python-ideas
mailing list