[Python-ideas] revisit pep 377: good use case?

Craig Yoshioka craigyk at me.com
Wed Feb 29 08:02:51 CET 2012


So I've recently been trying to implement something for which I had hoped the 'with' statement would be perfect, but it turns out, won't work because Python provides no mechanism by which to skip the block of code in a with statement.

I want to create some functionality to make it easy too wrap command line programs in a caching architecture.  To do this there are some things that need to happen before and after the wrapped CLI program is called, a try,except,finally version might look like this:

def cachedcli(*args):
    try:
    	hashedoutput = hashon(args)    
        if iscached():
            return hashedoutput
        acquirelock()
        cli(*args,hashedoutput)
        iscached(True)
        return hashedoutput
    except AlreadyLocked:
        while locked:
            wait()
        return example(*args)
    finally:
        releaselock()

the 'with' version would look like

def cachedcli(*args)
    hashedpath = hashon(args)
    with cacheon(hashedpath):
         cli(hashedpath,*args)
    return hashedpath
    

So obviously the 'with' statement would be a good fit, especially since non-python programmers might be wrapping their CLI programs... unfortunately I can't use 'with' because I can't find a clean way to make the with block code conditional.

PEP377 suggested some mechanics that seemed a bit complicated for getting the desired effect, but I think, and correct me if I'm wrong, that the same effect could be achieved by having the __enter__ function raise a StopIteration that would be caught by the context and skip directly to the __exit__ function.  The semantics of this even make some sense too me, since the closest I've been able to get to what I had hoped for was using an iterator to execute the appropriate code before and after the loop block:

def cachedcli(*args)
    hashedpath = hashon(args)
    for _ in cacheon(hashedpath):
         cli(hashedpath,*args)
    return hashedpath

this still seems non-ideal to me...





More information about the Python-ideas mailing list