Python "с" оператором против "с .. как" - PullRequest
14 голосов
/ 24 мая 2009

Только что выдернул мои волосы из-за разницы, я хотел бы знать, в чем разница действительно в Python 2.5.

У меня было два блока кода (dbao.getConnection() возвращает соединение MySQLdb).

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

И

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

Я думал, что это будет иметь тот же эффект, но, видимо, не так, как объект conn последней версии был Cursor. Откуда появился курсор и - это есть ли способ каким-то образом объединить инициализацию переменной и оператор?

Ответы [ 3 ]

30 голосов
/ 25 мая 2009

На первый взгляд может показаться немного странным, но

with babby() as b:
    ...

равно не эквивалентно

b = babby()
with b:
    ...

Чтобы понять почему, вот как будет реализован менеджер контекста:

class babby(object):
    def __enter__(self):
        return 'frigth'

    def __exit__(self, type, value, tb):
        pass

В первом случае имя b будет связано с тем, что возвращается из метода __enter__ диспетчера контекста. Часто это сам менеджер контекста (например, для файловых объектов), но это не обязательно; в данном случае это строка 'frigth', а в вашем случае это курсор базы данных.

Во втором случае b - это сам объект диспетчера контекста.

18 голосов
/ 24 мая 2009

В общих чертах, значение, присвоенное частью as оператора with, будет тем, что будет возвращено методом __enter__ диспетчера контекста .

1 голос
/ 24 мая 2009

Оператор with предназначен для того, чтобы, например, убедиться, что транзакция запущена и остановлена ​​правильно.

В случае соединений с базой данных в python, я думаю, что естественным решением будет создать курсор в начале оператора with, а затем зафиксировать или откатить транзакцию в конце.

Два блока, которые вы дали, одинаковы с точки зрения оператора. Вы можете также добавить as к первому и получить курсор.

Вам необходимо проверить, как реализована поддержка with в объекте, с которым вы ее используете.

См. http://docs.python.org/whatsnew/2.5.html#pep-343-the-with-statement

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...