Заключенные в скобки менеджеры контекста
Я пытаюсь понять, что нового в новой функции диспетчера контекста в скобках в 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
Это также делает различия более читабельными.