Ответ 1
В общих чертах значение, назначенное частью as
оператора with
, будет возвращено методом __enter__
контекстного менеджера.
Как только вытащили мои волосы из-за разницы, я хотел бы знать, какая разница действительно в Python 2.5.
У меня было два блока кода (dbao.getConnection()
возвращает соединение MySQLdb).
conn = dbao.getConnection()
with conn:
# Do stuff
и
with dbao.getConnection() as conn:
# Do stuff
Я думал, что они будут иметь такой же эффект, но, видимо, не так, как объект conn
последней версии был Cursor
. Откуда появился курсор и есть способ комбинировать инициализацию переменных и с инструкцией каким-то образом?
В общих чертах значение, назначенное частью as
оператора with
, будет возвращено методом __enter__
контекстного менеджера.
Это может быть немного запутанным на первый взгляд, но
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
- это сам объект менеджера контекста.
Оператор with должен содержать, например, чтобы убедиться, что транзакция запущена и остановлена правильно.
В случае соединений с базой данных в python, я считаю, что естественным является создание курсора в начале оператора with, а затем фиксация или откат транзакции в конце ее.
Два блока, которые вы указали, одинаковы с точки зрения утверждения. Вы можете добавить как к первому так же хорошо, и получить курсор.
Вам нужно проверить, как поддержка поддержки реализована в объекте, с которым вы его используете.
См. http://docs.python.org/whatsnew/2.5.html#pep-343-the-with-statement