For review: PEP 343: Anonymous Block Redux and Generator Enhancements
Nicolas Fleury
nid_oizo at yahoo.com_removethe_
Sat Jun 4 11:58:24 EDT 2005
Andrew Dalke wrote:
> The implementation would need to track all the with/as forms
> in a block so they can be __exit__()ed as appropriate. In this
> case ghi.__exit() is called after jkl.__exit__() and
> before defg.__exit__
>
> The PEP gives an easy-to-understand mapping from the proposed
> change to how it could be implemented by hand in the existing
> Python. Can you do the same?
I think it is simple and that the implementation is as much
straight-forward. Think about it, it just means that:
> with abc
>
> with defg:
> with ghi
> with jkl:
> 1/0
is equivalent to:
> with abc:
>
> with defg:
> with ghi:
> with jkl:
> 1/0
That's it. Nothing more complex. It's only about syntax.
> I have not idea if the problem you propose (multiple with/as
> blocks) will even exist so I can't comment on which solution
> looks good. It may not be a problem in real code, so not needing
> any solution.
Good point. As a C++ programmer, I use RAII a lot. However, there's
situations in C++ that don't apply, like allocating dynamic memory in a
scope. However, I still expect some Python programmers to use it enough
to ask for that syntax to be added, in the same way operators like +=
have been added.
But there's another point that has nothing to do with how many "with"
statements you have in a function. In C++, very very rarely I've seen
something like:
void foo() {
{ // (define a scope for the Lock object)
Lock locking(myMutex);
...
}
...
{
Lock locking(myMutex);
...
}
}
So I come to another conclusion: the indentation syntax will most of the
time result in a waste of space. Typically a programmer would want its
with-block to end at the end of the current block.
So basically, there's two 10-90% points, one in favor of my proposal,
one against:
- Most of the time, you don't have a lot of with-statements in a single
function, so not so much indentation.
- Most of the time, a with-statement ends at the end of current block,
so indentation-syntax most of the time result in a waste of space.
The way to see my proposal is not "to be used when you have multiple
with-blocks" but instead "never use the ':' syntax, unless necessary".
The day some code need it, it's very easy to add a ':' and indent some
code with our favorite editor.
Regards,
Nicolas
More information about the Python-list
mailing list