Подтвердить что ты не робот

Python 'с' statement versus 'with.. as'

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

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

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

и

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

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

4b9b3361

Ответ 2

Это может быть немного запутанным на первый взгляд, но

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 - это сам объект менеджера контекста.

Ответ 3

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

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

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

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

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