понедельник, 9 апреля 2012 г.

Python with statement

Я до недавнего времени ни разу не видел оператора 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 можно получить немного более чистый/читабельный код.

Ссылки: