Цепная динамическая итерация контекстных менеджеров к одному с оператором
У меня есть куча контекстных менеджеров, которых я хочу связать. На первый взглядcontextlib.nested
выглядело как подходящее решение. Однако этот метод помечен как устаревший в документации, в которой также говорится, что последнийwith
Заявление позволяет это напрямую:
Устаревший с версии 2.7: оператор with теперь поддерживает эту функцию напрямую (без запутанных ошибок, склонных к ошибкам).
Однако я не мог заставить Python 3.4.3 использовать динамический итеративный из контекстных менеджеров:
class Foo():
def __enter__(self):
print('entering:', self.name)
return self
def __exit__(self, *_):
pass
def __init__(self, name):
self.name = name
foo = Foo('foo')
bar = Foo('bar')
будь цепочкой:
from itertools import chain
m = chain([foo], [bar])
with m:
pass
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: __exit__
m = [foo, bar]
предоставление списка напрямую:
with m:
pass
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: __exit__
или распаковка:
with (*m):
pass
File "<stdin>", line 1
SyntaxError: can use starred expression only as assignment target
Итак, как правильно связать динамическое количество контекстных менеджеров вwith
Скажите правильно?