Повторное использование нескольких контекстов в Python с помощью оператора - PullRequest
0 голосов
/ 16 ноября 2018

В Python3 мы можем использовать несколько контекстов с операторами. Но возможно ли ввести несколько контекстов, если они не могут быть созданы сразу в операторе with? Можно ли сделать что-то подобное?

def files():
    return open('a.txt', 'w'), open('b.txt', 'w')

with files():
    pass

Или это:

files = open('a.txt', 'w'), open('b.txt', 'w')
with files:
    pass

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Пример использования contextlib.ExitStack:

from contextlib import ExitStack

def files(stack, *args):
    return [stack.enter_context(open(f, "w")) for f in args]

with ExitStack() as stack:
    f1, f2 = files(stack, "a.txt", "b.txt")
    ...

или без оболочки

with ExitStack() as stack:
    f1, f2 = [stack.enter_context(open(f, "w")) for f in ["a.txt", "b.txt"]]
    ...

Однако, когда вы знаете, сколько файлов нужно открыть раньше времени (и этонебольшое количество файлов), форма множественного менеджера оператора with, как показано в Ответ Джорана Бизли проще.

0 голосов
/ 16 ноября 2018
from contextlib import contextmanager

@contextmanager
def files():
    with open('a.txt', 'w') as f1, open('b.txt', 'w') as f2:
         yield f1,f2

может быть?

with files() as (f1,f2):
     print(f1,f2)
...