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