[Python-ideas] Fwd: quantifications, and tuple patterns

MRAB python at mrabarnett.plus.com
Sun Jan 15 03:45:28 CET 2012

```On 15/01/2012 02:01, Steven D'Aprano wrote:
> Guido van Rossum wrote:
>>  On Sat, Jan 14, 2012 at 1:38 PM, Paul Moore<p.f.moore at gmail.com>  wrote:
> [...]
>>>  So, going back to what Annie was referring to, there seem to be three
>>>  key concepts:
>>>
>>>  Quantifications, which are covered in Python by any() and all()
>>>  Capturing a "witness", which can be done using assignment-as-expression
>>>  Tuple matching, which you have shown can be handled using tuple
>>>  unpacking plus the generator expression if clause, but could probably
>>>  gain from a more compact notation.
>>>
>>
>>  I'm not sure we need a new construct for tuple matching. Witness capturing
>>  seems the most important missing feature here.
>
>
> If I recall correctly, there have been occasional discussions about changing
> any() and all() to return the item found rather than a flag. Given the need
> for backwards compatibility, I don't think we can or should do this, but a
> hypothetical quant module, or a few new built-ins, could possibly help here.
> I'm not sure that quantifications are quite important enough to justify new
> syntax.
>
> For lack of better names:
>
>
> def all2(iterable, pred=bool):
>       """Like all(pred(obj) for obj in iterable), returning True if it is true,
>       otherwise obj, the first witness that it false.
>       """
>       for obj in iterable:
>           if not pred(obj):
>               return obj
>       return True
>
> def any2(iterable, pred=bool):
>       """Like any(pred(x) for x in iterable), returning False if it is false,
>       otherwise obj, the first witness that it is true.
>       """
>       for obj in iterable:
>           if pred(obj):
>               return obj
>       # I look forward to the bike-shedding about returning None
>       # vs returning False ;)
>       return False
>
>
> 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.
>
A 'default' parameter perhaps?

>>> witness = any2([3, 0, 2, 4], lambda n: n % 2 == 0, default=None)
>>> if witness is not None:
...     print("first even number is", witness)
... else:
...     print("everything is odd")
...
first even number is 0

```