@zlodiak

Почему __enter__ заканчивается return?

Написал контекстный менеджер, который и так уже существует:

class FileConn:
 
    def __init__(self, file_name):
        self.file_name = file_name
    
    def __enter__(self):
        print('open connection')
        self.file = open(self.file_name, 'r')
        return self.file
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('close connection')
        self.file.close()
 
if __name__ == '__main__':
    print('start of script')

    name = 'test.txt'
    
    with FileConn(name) as file:
        for string in file:
            print(string, end=' ')

    print('end of script')


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

Этот метод приравнивает дескриптор файла к переменной self.file. Этого уже достаточно чтобы работать с файлом, непонятно какую функцию выполняет здесь return. Но без этой инструкции код перестаёт выполняться
  • Вопрос задан
  • 406 просмотров
Решения вопроса 1
На самом деле, всё логично.
with FileConn(name) as file
В данном примере в file должен оказаться дескриптор открытого файла. Соответственно, конструкция with, вызывая метод __enter__, получает объект, над которым будут проводится манипуляции в этом блоке with. В данном случае - открытый файл. В конце блока with, соответственно, будет вызван метод __exit__.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы