Having just pulled my hair off because of a difference, I\'d like to know what the difference really is in Python 2.5.
I had two blocks of code (dbao.
In general terms, the value assigned by the as
part of a with
statement is going to be whatever gets returned by the __enter__ method of the context manager.
The with statement is there to allow for example making sure that transaction is started and stopped correctly.
In case of database connections in python, I think the natural thing to do is to create a cursor at the beginning of the with statement and then commit or rollback the transaction at the end of it.
The two blocks you gave are same from the with statement point of view. You can add the as to the first one just as well and get the cursor.
You need to check how the with support is implemented in the object you use it with.
See http://docs.python.org/whatsnew/2.5.html#pep-343-the-with-statement
It may be a little confusing at first glance, but
with babby() as b:
...
is not equivalent to
b = babby()
with b:
...
To see why, here's how the context manager would be implemented:
class babby(object):
def __enter__(self):
return 'frigth'
def __exit__(self, type, value, tb):
pass
In the first case, the name b
will be bound to whatever is returned from the __enter__
method of the context manager. This is often the context manager itself (for example for file objects), but it doesn't have to be; in this case it's the string 'frigth'
, and in your case it's the database cursor.
In the second case, b
is the context manager object itself.