Я до недавнего времени ни разу не видел оператора with, но то как оно используется показалось мне интересным. Этот оператор используется для того чтобы удостовериться что будет вызыван clean-up код, например, закрытие файла, освобождение lock'а и т.п., для чего раньше использовалось try/catch/finally.
Пример: with open("file.txt") as f:
for line in f:
print (line)
В этом примере file.txt откроется для чтения, а после выхода из этого блока кода f будет сам закрыт, даже в случае ошибки.
Тогда как без with нужно было делать что-то вроде этого: f = open("file.txt")
try:
for line in f:
print(line)
finally:
f.close()
with использует методы __enter__() и __exit__() для получения в f того что возвращает open() и закрытия файла соответственно. Мы можем повторить это поведение так:
f = open("file.txt")
f.__enter__()
for line in f:
print(line)
f.__exit__()
Метод __exit__() будет вызван в любом случае, что похоже на поведение блока finally. Если после __exit__() попробовать обратиться к f - будет выведена ошибка о том что файл уже закрыт.
Вобщем используя with можно получить немного более чистый/читабельный код.
Ссылки:
- PEP 343 добавивший это ключевой слово можно посмотреть здесь.
- Подробный разбор оператора with - http://effbot.org/zone/python-with-statement.htm