'with' statement in python ?

D-Man dsh8290 at rit.edu
Tue Jun 26 13:45:34 EDT 2001


On Tue, Jun 26, 2001 at 10:41:31AM -0300, Carlos Ribeiro wrote:
| At 11:49 26/06/01 +0000, Maciej Pilichowski wrote:
| >I have just started learning Python yesterday but...
| >
| > >def with_is_broken(a):
| > >   with a:
| > >     print x
| > >
| > >The snippet above assume that "a" must have a member attribute called "x".
| >
| >Nope. As you referred to Pascal -- if "a" has a member "x" it is read
| >as "a.x", if not it is standalone "x".
| 
| There must be some misunderstanding here. My snippet (incomplete, as I 
| pointed out) assumed that Python had a "with" keyword, just to show the 
| kind of problems that arise. In Python, the compiler/interpreter has no way 
| to tell beforehand if x is a member of a, a local variable, a module level 
| variable, or a global variable. This ambiguity makes the use of with in 
| Python impossible.

It's not impossible, it would just be a runtime determination.
Already for bare names python looks in locals(), then up through the
nested scopes (if enabled) and in globals() and __builtin__.  It
_could_ do the same for instances in the presence of a 'with'
statement.

After stating that it _could_ be implemented, I think it is a BAD idea
because it is just some more magic and can make it really hard to
trace through how the code will act.  Normally trying to access a
member of an instance that doesn't exist is an error and should raise
AttributeError.  If this sort of Pascal-ish magic is used then more
obscure bugs can be introduced.  It also makes it hard to tell (like
in C++ and Java) whether a variable is local, global, "static", or a
part of this instance.

| member of "a", then the compiler will recursively search on the outer 
| namespaces until it finds a definition for "x". If it does not find, it 
| will stop - it is a fatal error, caught at compile time.

This isn't quite as bad as it would be with Python because it is a
compile-time message.  

-D





More information about the Python-list mailing list