Разделение нескольких менеджеров контекста одного уровня на несколько строк в Python - PullRequest
0 голосов
/ 13 июня 2019

Я знаю, что оператор with поддерживает несколько менеджеров контекста на одном уровне, например:

with open('foo.txt') as foo, open('bar.txt') as bar:
    do_something()

Но что, если список менеджеров контекста становится слишком длинным для одной строки?Например:

with open('foo.txt') as foo, open('bar.txt') as bar, open('bla.txt') as bla, open('yada.txt') as yada:
    do_something()

В настоящее время это недопустимый синтаксис в Python 3.7:

with (
    open('foo.txt') as foo,
    open('bar.txt') as bar,
    open('bla.txt') as bla,
    open('yada.txt') as yada, # same thing without the last trailing comma
):
    do_something()
with 
    open('foo.txt') as foo,
    open('bar.txt') as bar,
    open('bla.txt') as bla,
    open('yada.txt') as yada, # same thing without the last trailing comma
:
    do_something()

Я мог бы сделать:

foo = open('foo.txt')
bar = open('bar.txt')
bla = open('bla.txt')
yada = open('yada.txt')

with foo, bar, bla, yada:
    do_something()

Но даже ЭТО моглорасти слишком долго, пока я добавляю больше менеджеров контекста.

Я мог бы также сделать:

with open('foo.txt') as foo:
    with open('bar.txt' as bar:
        with open('bla.txt' as bla:
            with open('yada.txt') as yada:
                do_something()

Но это уродливо.В нем также отсутствуют смысловые намеки для читателя.Есть причина, по которой мы бы хотели разместить несколько менеджеров контекста на одном уровне.

Я знаю, что много менеджеров контекста очень редко принадлежат к одному и тому же уровню, ноэто определенно возможно.

1 Ответ

1 голос
/ 13 июня 2019

Продолжения строки - ваш друг здесь ...

with \
    open('foo.txt') as foo, \
    open('bar.txt') as bar, \
    open('bla.txt') as bla, \
    open('yada.txt') as yada \
:
    do_something()

Это на самом деле специально упоминается в PEP-8 .

...