Попытка выяснить, как работает конструкция "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
предложение, если оно есть.