[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
More information about the Python-ideas
mailing list