TGTGInsighttelegram intelligenceLIVE / telegram public index
← Python Заметки
Python Заметки avatar

TGINSIGHT POST

Post #286

@pythonotes

Python Заметки

Views1,670Post view count
PostedSep 2709/27/2021, 09:00 AM
Post content

Post content

В одном из прошлых постов был вопрос в комментариях по поводу закрытия файла. Тогда я бегло пояснил что Python сам собирает мусор в памяти. Давайте пройдемся по этому вопросу более внимательно. Когда вы открываете файл не сохраняя его в переменную, на самом деле файл остаётся открытым. Ссылка на него теряется где-то в памяти пока сборщик мусора не доберется до него. Давайте сделаем несколько экспериментов. Откроем файл не сохраняя его в переменную и поищем этот объект в памяти. Для поиска будем использовать вот такую функцию def check_file(): import io, gc for obj in gc.get_objects(): if isinstance(obj, io.TextIOWrapper) and \ obj.name == 'testfile': print('File', obj.name, 'is closed:', obj.closed) return print('Not found') Тест первый: файл, открытый в функции def func(): open('testfile', 'w') Вызываем функцию и проверяем наличие файла >>> func() >>> check_file() Not found Здесь всё предсказуемо. Все локальные переменные функции удаляются когда функция завершится. А при удалении файл закрывается. Тест второй: теперь откроем файл просто в коде, можно в интерактивной консоли. open('testfile', 'w') И снова он не сохранён в переменную, а значит будет удалён сборщиком мусора. Проверим: >>> check_file() File testfile is closed: False Бывалые сразу же скажут, что файл улетел в переменную "_", и будут правы! >>> print(_) <_io.TextIOWrapper name='testfile' mode='w' encoding='UTF-8'> Давайте обнулим её, можно просто распечатать любое число в консоли >>> 123 >>> print(_) 123 Проверим >>> check_file() Not found ➡️ Отсюда вывод: Всегда явно закрывайте файлы! Не рассчитывайте что кто-то (gc) сделает это за вас. _________________ Мои примеры порой содержат оптимизации в угоду краткости но в ущерб правильности. #tricks