Это правильный способ использования оператора python "with" в сочетании с блоком try-except ?:
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
Если это так, то при старом способе работы:
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
Является ли здесь основное преимущество оператора with в том, что мы можем избавиться от трех строк кода? Это не кажется мне убедительным для этого варианта использования (хотя я понимаю, что оператор «with» имеет другие применения).
РЕДАКТИРОВАТЬ: идентичны ли функции двух вышеуказанных блоков кода?
EDIT2: Первые несколько ответов в целом говорят о преимуществах использования «with», но здесь они кажутся незначительными. Все мы (или должны были) явно вызывать f.close () в течение многих лет. Я полагаю, что одним из преимуществ является то, что небрежным кодировщикам будет полезно использовать "with".
Ответы:
finally
предложении, потому чтоf
оно не привязано.Эквивалентный код старого стиля:
Как видите,
with
оператор может снизить вероятность ошибок. В более новых версиях Python (2.7, 3.1) вы также можете комбинировать несколько выражений в одномwith
операторе. Например:Кроме того, я лично считаю плохой привычкой обнаруживать любое исключение как можно раньше. Это не цель исключений. Если функция ввода-вывода, которая может выйти из строя, является частью более сложной операции, в большинстве случаев ошибка IOError должна прервать всю операцию и, таким образом, обрабатываться на внешнем уровне. Используя
with
операторы, вы можете избавиться от всех этихtry...finally
операторов на внутренних уровнях.источник
Если содержимое
finally
блока определяется свойствами открываемого файлового объекта, почему разработчик файлового объекта не должен записыватьfinally
блок? Это преимуществоwith
оператора, гораздо большее, чем сохранение трех строк кода в данном конкретном случае.И да, способ, которым вы объединились,
with
иtry-except
это практически единственный способ сделать это, поскольку исключительные ошибки, вызванные внутри самогоopen
оператора, не могут быть обнаружены в пределахwith
блока.источник
Я думаю, вы ошиблись насчет утверждения "with", что оно сокращает только строки. Фактически он выполняет инициализацию и разборку.
В вашем случае "с" делает
Вот ссылка для понимания оператора «с»: http://effbot.org/zone/python-with-statement.htm
Изменить: Да, вы правильно используете «with», и функциональность обоих блоков кода идентична. Вопрос о том, зачем использовать «с»? это из-за преимуществ, которые вы получаете с ним. как вы упомянули о случайном отсутствии f.close ().
источник
Более питонический способ для следующих кодов:
источник
readline()
вызов, ваша версия не закроет файл, если вreadline()
результате будет получен файлIOError
.