Можно ли закрыть файл сразу после вызова функции - PullRequest
0 голосов
/ 23 января 2020

У меня есть следующая строка:

service = discovery.build('sheets', 'v4', credentials=pickle.load(open('google_sheets_token.pickle', 'rb')))

И хотя реализовать что-то вроде этого тривиально:

with open('google_sheets_token.pickle', 'rb') as f:
    service = discovery.build('sheets', 'v4', credentials=pickle.load(f)) 

Мне было интересно, можно ли автоматически закрывать файлы после прохождения к функции?

1 Ответ

4 голосов
/ 23 января 2020

Неа. В интерпретаторе ссылок CPython, если циклы ссылок не выполняются (их легче запустить, чем вы думаете, поэтому ничего не предполагайте), первый пример автоматически закроет файл, когда счетчик ссылок уменьшится до 0 сразу после возврата рассматриваемой функции (при условии, что она не сохранила ссылку). Но это не то, на что можно положиться; используйте оператор with, если хотите получить гарантии на CPython, и даже надежду на правильное поведение альтернативных интерпретаторов с подсчетом без ссылок, таких как PyPy, Jython, Iron Python и др. c. Без with управления файл, вероятно, в конечном итоге закроется, но нет никаких гарантий относительно того, когда это произойдет (или даже если это лучшее из возможных, а не железная гарантия).

...