Обзор с милями: когда вы покидаете вложенный блок, Python автоматически вызывает f.close()
.
Не имеет значения, выходите ли вы просто снижаясь со дна или звоните break
/continue
/return
, чтобы выпрыгнуть из него или вызвать исключение; независимо от того, как вы покинете этот блок. Это всегда знает, что вы уезжаете, так что всегда закрывает файл *
Один уровень вниз, вы можете думать о нем, как отображение на try:
/finally:
заявление:.
f = open(filename)
try:
# My Code
finally:
f.close()
Один уровень вниз: Как это известно, чтобы позвонить close
вместо чего-то другого?
Ну, на самом деле это не так. Это на самом деле требует специальных методов __enter__
и __exit__
:
f = open()
f.__enter__()
try:
# My Code
finally:
f.__exit__()
и объект, возвращаемый open
(а file
в Python 2, один из оберток в io
в Python 3) есть что-то вроде этого в нем:
def __exit__(self):
self.close()
Это на самом деле немного сложнее, чем последняя версия, что упрощает создание сообщений об ошибках и позволяет Python избегать «ввода» блока, который не знает, как t o «выход».
Чтобы понять все детали, перейдите по ссылке PEP 343.
Кроме того, если кто-то явно закрыть файл, он будет иметь какой-либо нежелательный эффект?
В общем, это плохая вещь.
Однако файловые объекты выходят из своего пути, чтобы сделать его безопасным. Ошибка заключается в закрытом файле, кроме close
.
* Если вы не оставить, скажем, потянув за шнур на сервере в середине его выполнения вашего скрипта. В этом случае, очевидно, он никогда не запускает код, а тем более close
. Но явный close
вряд ли вам поможет.
http://effbot.org/zone/python-with-statement.htm – piokuc
Я удалил тег '' питон-2.7'', потому что оператор with не является специфичным для этой версии Python. Оператор с был введен в Python 2.5 и с тех пор является фундаментальной особенностью Python. Страница промежуточного блога на эту тему находится здесь: (http://preshing.com/20110920/the-python-with-statement-by-example/) – eyquem