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

Nick Coghlan ncoghlan at gmail.com
Mon Jan 16 15:15:05 CET 2012


On Mon, Jan 16, 2012 at 5:46 AM, Paul Moore <p.f.moore at gmail.com> wrote:
>> In summary, again, I think we should support proper quantifications.
>
> I'm getting more comfortable with the idea, but I think it needs a bit
> more discussion to come up with something that fits in cleanly with
> the rest of Python, while still adding the value you want.

Indeed.

With the clarification that my original "long form" expansion was
incorrect (since it only looped over the outer set once), I'll put
forward a slightly shorter variant of Guido's expansion (as someone
else already noted, next() can be a useful alternative to pop() if you
aren't keeping the original set around)

    _sentinel = object()
    while True:
        p1 = next((p for (s0,p1) in decisions if s0==slot_num), _sentinel)
        if p1 is _sentinel:
            break

        for p2 in {p2 for (s0,p2) in proposals if s0==slot_num and p2 != p1}:
            ...

So, let's consider this proposal:

"some VAR in ITERABLE if COND" would be an expression that:

1. *deliberately* leaks the variable into the surrounding scope
(embedded assignment ahoy)
2. Defines the expression value roughly as follows:

    _itr = (VAR for VAR in ITERABLE if COND) # i.e. it's an implicit
generator expression
    try:
        VAR = next(_itr)
    except StopIteration:
        _expr_result = False
    else:
        _expr_result = True

And, further suppose, that we finally cave on allowing a filter clause
in for statements

Then Annie's original example would look like this:

    while some s0, p1 in decisions if s0==slot_num:
        for s0, p2 in proposals if s0==slot_num and p2 != p1:
            ...

And, since we *know* anything even vaguely resembling an embedded
assignment syntax would almost immediately be adopted for any-and-all
of the various embedded assignment requests we've seen over the years,
here's how it would look for the regex use case:

    if some m in [pattern.search(data)] if m is not None:
        ...

Hmm, still doesn't feel right to me - trying to shove a square peg
(mathematical quantification) into a round hole (Python's syntax). In
particular, the any()/all() way of doing things avoids the double-if
problem when used in an if statement, whereas the version that
captures the variable (and hence moves the predicate to the end) reads
very strangely in that case.

Removing the if clause doesn't help, since you can easily add it back
by using a generator expression as your iterable.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia



More information about the Python-ideas mailing list