Что назначается переменной `variable`, в` with expression as variable`?

Из обучения Python:

Основной формат оператора with выглядит следующим образом: здесь есть необязательная часть в квадратных скобках:

with expression [as variable]: with-block 

Предполагается, что expression здесь возвращает объект, поддерживающий протокол управления контекстом (подробнее об этом протоколе в данный момент). Этот объект также может возвращать значение, которое будет присвоено variable имени, если присутствует необязательное предложение.

Обратите внимание, что variable не обязательно присваивается результат expression ; результатом expression является объект, поддерживающий контекстный протокол, и variable может быть присвоено что-то другое, предназначенное для использования внутри оператора.

expression оценивается объектом контекстного менеджера.

Что назначается variable ? В цитате говорится, что это не объект контекстного менеджера.

Указывает ли назначение variable вызов некоторого метода класса контекстного менеджера для получения фактического значения, присвоенного variable ?

Благодарю.

2 Solutions collect form web for “Что назначается переменной `variable`, в` with expression as variable`?”

Что бы ни было возвращено из __enter__ . Из документации по методу менеджеров контекста __enter__ :

contextmanager.__enter__()

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

(Акцент мой)

Результат вызова __enter__ вполне может быть менеджером контекста, ничто в спецификации не запрещает это. Конечно, это может быть другой объект, связанный с контекстом среды выполнения, как состояние документов.

Объекты, которые возвращаются из __enter__ могут использоваться снова и снова в качестве менеджеров контекста. file объекты , например:

 with open('test_file') as f1: # file.__enter__ returns self with f1 as f2: # use it again, get __self__ back print("Super context managing") with f2 as f3, f1 as f4: # getting weird. print("This can go on since f1.__enter__ returns f1") print("f1.__exit__ has been called here, though :)") print("f1 closed: {}".format(f1.closed)) 

Не то, чтобы предыдущее имело большой смысл, а просто для того, чтобы четко прояснить ситуацию.

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

 In [1]: class Foo: ...: def __enter__(self): ...: return 'hello' ...: def __exit__(self, *args): ...: pass ...: In [2]: with Foo() as a: ...: print(a) ...: hello 
  • Код SuperTrend с использованием pandas python
  • Почему печать в Python не приостанавливается при использовании сна в цикле?
  • Супер и понимание Python3 -> TypeError?
  • Как инициализировать экземпляр подкласса кортежа в Python?
  • Python 3 Получить страницу HTTP
  • Назначение Tuple в Python, это ошибка в Python?
  • python 3: чтение байтов из stdin pipe с readahead
  • Удалить новую строку «\ n» из кодированных строк base64 в Python3?
  • Как повторно запустить код в Python?
  • Создание скрипта `nosetests` для выбора папки по версии Python
  • Какие символы Unicode принимаются в именах переменных Python3?
  • Python - лучший язык программирования в мире.