<br><br><div class="gmail_quote">On Mon, Apr 11, 2011 at 11:47 PM, Nick Coghlan <span dir="ltr"><<a href="mailto:ncoghlan@gmail.com">ncoghlan@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Tue, Apr 12, 2011 at 3:06 PM, Nick Coghlan <<a href="mailto:ncoghlan@gmail.com">ncoghlan@gmail.com</a>> wrote:<br>
> ys = [y for x in xs given f(x) if p(x) else g(x) as y]<br>
<br>
</div>You know, I may have spoken too soon in saying PEP 3150 couldn't help<br>
with the list comprehension use case.<br>
<br>
def remember(f):<br>
    """Decorator that remembers result until arguments change"""<br>
    # Essentially an LRU cache for exactly 1 entry<br>
    last_args = object(), object()<br>
    last_result = None<br>
    @functools.wraps(f)<br>
    def wrapped(*args, **kwds):<br>
        nonlocal last_args, last_result<br>
        if last_args != args, kwds:<br>
            last_args = args, kwds<br>
            last_value = f(*args, **kwds)<br>
        return last_value<br>
    return wrapped<br>
<br>
ys = [y(x) for x in xs if y(x)] given:<br>
    y = remember(f)<br>
<br>
Or for the more complicated case:<br>
<br>
ys = [y(x) for x in xs if y(x)] given:<br>
    @remember<br>
    def y(x):<br>
        fx  = f(x)<br>
        return fx if fx else g(x)<br>
<br>
Or even (using the subgenerator approach):<br>
<br>
ys = [y for y in all_y if y] given:<br>
    all_y = (f(x) for x in x)<br>
<br>
There are all *sorts* of tricks that open up once you don't even need<br>
to think about possible impacts on the local namespace.<br>
<div><div></div><div class="h5"><br>
</div></div></blockquote><div><br></div><div>Like Georg just said, the given clause seems hard to read.  He was referring to the embedded clause in the list comprehension.  I kind of feel the same way about the PEP 3150 syntax.  I remember when I was first exposed to list comprehensions.  At first it was hard because it was organized differently from any other Python code.  However, I have adjusted.  Maybe a given clause would be the same.  I'm just not sure.</div>
<div><br></div><div>That "given" after the expression keeps throwing me off.  It just looks out of place.  Would something like the following be feasible:</div><div><br></div><div>c = sqrt(a*a + b*b) given:</div>
<div>    a = retrieve_a()</div><div>    b = retrieve_b()</div><div><br></div><div>becomes:</div><div><br></div><div>given:</div><div>    a = retrieve_a()</div><div>    b = retrieve_b()</div><div>c = sqrt(a*a + b*b)</div><div>
<br></div><div>where the given statement is effectively _decorating_ the simple statement?  Unfortunately I am not familiar enough yet with the compiler to know what such decoration would entail, much less if it would be entirely too complicated.  However, I wanted to throw out there an alternative that is maybe more readable.  It's also one I would probably find more usable for plugging in given blocks or disabling them, much like with decorators.</div>
<div><br></div><div>I know this throws off the approach the PEP takes, but I am trying to wrap my head around how I would use statement local namespaces.  I like how it cleans up from the namespace those bits that only matter to the target statement.  It does make it easier to follow to whom those statements in the given block belong.  Anyway, this has certainly been an enlightening discussion.  I hope it bears fruit.</div>
<div><br></div><div>-eric</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div class="h5">Cheers,<br>
Nick.<br>
<br>
--<br>
Nick Coghlan   |   <a href="mailto:ncoghlan@gmail.com">ncoghlan@gmail.com</a>   |   Brisbane, Australia<br>
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-ideas" target="_blank">http://mail.python.org/mailman/listinfo/python-ideas</a><br>
</div></div></blockquote></div><br>