Заключенные в скобки менеджеры контекста

Я пытаюсь понять, что нового в новой функции диспетчера контекста в скобках в Python 3.10 (главный пункт в новых функциях здесь).

Мой тестовый пример заключался в том, чтобы попытаться написать:

      with (open('file1.txt', 'r') as fin, open('file2.txt', 'w') as fout):
    fout.write(fin.read())

Супер простой тест, отлично работает в Python 3.10.

Моя проблема в том, что он также отлично работает в Python 3.9.4?

Тестируя это в Python 3.8.5, похоже, что это не работает, повышая ожидаемый .

Я неправильно понимаю это обновление, поскольку кажется, что этот новый синтаксис был введен в 3.9?

1 ответ

Я не знал, что это было, но я рад это видеть. Профессионально я использовал 3.6 (у которого этого нет), а с несколькими длинными строками контекстных менеджеров и черным действительно сложно отформатировать:

Если у вас есть это:

      with some_really_long_context_manager(), and_something_else_makes_the_line_too_long():
    pass

Вы должны написать это некрасиво:

      with some_really_long_context_manager(), \
    and_something_else_makes_the_line_too_long():
    pass

Если ваши аргументы слишком длинные:

      with some_context(and_long_arguments), and_another(now_the_line_is_too_long):
    pass

Вы можете сделать что-то вроде:

      with some_context(and_long_arguments), and_another(
    now_the_line_is_too_long
):
    pass

Но это не сработает, если один диспетчер контекста не принимает аргументов, и в любом случае это выглядит немного странно:

      with some_context(and_long_arguments), one_without_arguments(
    ), and_another(now_the_line_is_too_long):
    pass

Для этого придется переставить:

      with some_context(and_long_arguments), and_another(
    now_the_line_is_too_long
), one_without_arguments():
    pass

С новым синтаксисом это можно отформатировать как:

      with (
    some_context(and_long_arguments),
    one_without_arguments(), 
    and_another(now_the_line_is_too_long), 
):
    pass

Это также делает различия более читабельными.

Другие вопросы по тегам