Попытка выяснить, как работает конструкция "with..as" в python

Я пытаюсь изучить python, и я приземлился на

with..as

который используется следующим образом:

with open("somefile.txt", 'rt') as file:
    print(file.read()) 
    # at the end of execution file.close() is called automatically.

Итак, как стратегия обучения, я попытался сделать следующее:

class Derived():

    def __enter__(self):
        print('__enter__')

    def __exit__(self, exc_type, exc_value, traceback):
        print('__exit__')

with  Derived() as derived:
    print(derived)

и я получил этот вывод:

__enter__
None
__exit__

Мой вопрос:

  • Почему print(derived) возвращает объект None, а не объект Derived?

Ответы

Ответ 1

Имя derived привязано к объекту, возвращаемому методом __enter__, который равен None. Попробуйте:

def __enter__(self):
    print('__enter__')
    return self

Документы:

object.__enter__(self)

Введите контекст среды выполнения, связанный с этим объектом. Оператор with привяжет эти методы к возвращаемому значению целевым объектам, указанным в as предложение, если оно есть.