Элементы языка Python

Материал из Xgu.ru

Перейти к: навигация, поиск

Содержание

[править] Вопросы и ответы

[править] Зачем нужен with?

with это хитрая вещь, которая позволяет значительно сократить конструкции такого вида

con1 = users_db(uid)
con2 = users_db(uid)

con1.startTransaction()
con2.startTransaction()

try:
    con1.delete('foo', id=1)
    con2.delete('bas', id=1)
except:
    con1.rollback()
    con2.rollback()
    raise
else:
    con1.commit()
    con2.commit()

до такого:

con1 = users_db(uid)
con2 = users_db(uid)

with transaction(con1, con2):
    con1.delete('timelines', id=1)
    con2.delete('timelines', id=1)

То есть, основной её смысл в том, что мы можем не беспокоиться о том, что нам нужно закрыть транзакцию, или откатить её, в случае, если что-нибудь пошло не так.

Эта задача возлагается на плечи функции (или класса), который передаётся в качестве аргумента with.

With автоматически позаботится о том, чтобы выполнить закрывающую часть функции, даже если with покинули из-за исключения или как-то иначе:

@contextmanager
def for_with():
    try:
        print 1
        yield
    finally:
        print 3

def func():
    with for_with():
        print 2
        return False

Подробнее:

Ещё надо разобраться с понятием contextmanager, поскольку оно имеет к with самое непосредственное отношение:

[править] Обработка исключений

[править] Дополнительная информация

[править] Примечания