Nicolas Fleury wrote:
> What about making the ':' optional (and end implicitly at end of current 
> block) to avoid over-indentation?
> 
> def foo():
>      with locking(someMutex)
>      with opening(readFilename) as input
>      with opening(writeFilename) as output
>      ...
>
> would be equivalent to:
> 
> def foo():
>      with locking(someMutex)
>          with opening(readFilename) as input
>              with opening(writeFilename) as output
>                  ...

Nothing in Python ends at the end of the current block.
They only end with the scope exits.  The order of deletion
is not defined, and you would change that as well.

Your approach wouldn't allow the following

with locking(mutex):
  increment_counter()

x = counter()

with locking(mutex):
  decrement_counter()

 
except by making a new block, as

if 1:
  locking(mutex)

  x = counter()

if 1:
  locking(mutex)


If the number of blocks is a problem it wouldn't be that
hard to do

with multi( locking(someMutex),
            opening(readFilename),
            opening(writeFilename) ) as _, input, output:
  ...

Untested sketch of an implementation


class multi(object):
  def __init__(self, *args):
    self.args = args
  def __enter__(self):
    results = []
    for i, arg in enumerate(self.args):
      try:
        results.append(arg.__enter__())
      except:
        # back up through the already __entered__ args
        exc = sys.exc_info()
        for j in range(i-1, -1, -1):
          try:
            self.args[j].__exit__(*exc)
          except:
            # Need to get the new exception, to match the PEP behavior
            exc = sys.exc_info()
        raise exc[0], exc[1], exc[2]
    return results

  def __exit__(self, type, value, traceback):
    for arg in self.args[::-1]:
      try:
        arg.__exit__(type, value, traceback)
      except:
        type, value, traceback = sys.exc_info()

                                Andrew
                                [EMAIL PROTECTED]

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to