Закрывает ли файл открытие и выполнение операции над этим файлом в одной строке? - PullRequest
0 голосов
/ 03 июля 2018

Безопасно ли открывать файл и затем выполнять операции с этим файлом в той же строке, не закрывая файл впоследствии?

Например, если бы я использовал модуль zipfile и хотел получить список файлов внутри zip-файла с именем file_list, было бы безопасно сделать следующее:

import zipfile
import os
zip_path = os.path(...)

file_list = zipfile.ZipFile(zip_path).namelist()

Конечно, я знаю, что этот код будет безопасно выполнять то же самое, хотя и в 2 строки:

import zipfile
import os
zip_path = os.path(...)

with zipfile.ZipFile(zip_path) as my_zip:
    file_list = my_zip.namelist()

Что лучше?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Он закроет файл при сборке мусора

# ZipFile in zipfile.py
def __del__(self):
    """Call the "close()" method in case the user forgot."""
    self.close()

Если вы используете этот вкладыш, он не создает ссылку, поэтому он должен быть утилизирован и, в свою очередь, закрыт. Но вы полагаетесь на детали реализации, когда GC работает, что не лучшая идея, вам лучше использовать with.

Например, один вкладыш не будет вести себя так же, как pypy

0 голосов
/ 03 июля 2018

Из документов :

ZipFile.close()

Закройте файл архива. Вы должны позвонить close() перед выходом из программы, иначе необходимые записи не будут записаны.

Вообще говоря, почти всегда лучше использовать менеджер контекста. Считается аккуратнее и безопаснее.

...