tags:

views:

882

answers:

3

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.getConnection() returns a MySQLdb connection).

conn = dbao.getConnection()
with conn:
    # Do stuff

And

with dbao.getConnection() as conn:
    # Do stuff

I thought these would have the same effect but apparently not as the 'conn' object of the latter version was a 'Cursor'. Where did the cursor come from and is there a way to combine the variable initialization and with statement somehow?

+1  A: 

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

iny
+6  A: 

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.

pantsgolem
Was suspecting this. Thanks for the confirmation!
Mikko Rantanen
+5  A: 

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.

dF
At times like these I wish I could award two answers. :|
Mikko Rantanen