Что назначается переменной `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 
  • Какой ключ не удалось выполнить в Python KeyError?
  • Функция квадратов Python
  • sklearn не имеет атрибутов 'dataatets'
  • Python3: вычисление комплексных показателей и логарифмов
  • Python3.0 - tokenize и untokenize
  • подклассификация файловых объектов (для продолжения операций открытия и закрытия) в python 3
  • Python 3 Как «объявить» пустую переменную `bytes`
  • Доступ к переменным класса из понимания списка в определении класса
  • Python - лучший язык программирования в мире.