Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python's 'with' statement versus 'with .. as'

Tags:

python

syntax

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?

like image 507
Mikko Rantanen Avatar asked May 24 '09 11:05

Mikko Rantanen


1 Answers

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.

like image 103
dF. Avatar answered Oct 23 '22 20:10

dF.