Я столкнулся с этой проблемой во время написания некоторых кода для задачи.
У меня есть некоторые Код Что я хочу написать в определенный файл, если предоставляется имя файла или стандартный выход, если нет:
with (open(filename, 'w') if filename else sys.stdout) as file: do_something(file)
Что с
Линия немного длинная, и не кажется читаемым взглядом. Я мог бы поставить открыть
вне с
:
f = open(filename, 'w') if filename else sys.stdout with f as file: do_something(file)
Файл должен быть закрыт, когда с
выходит. Я закончил с stdout
В этом случае, но я мог бы просто хорошо хотел использовать его для других вещей позже в программе. Но самое худшее об этом способе делать это, кажется, что привыкнуть использовать открыть
снаружи с
Выражение может привести к забыванию к закрытию файлов.
Я мог бы пойти постараться/Наконец-то маршрут:
try: f = open(filename, 'w') if filename else sys.stdout do_something(f) finally: if f is not sys.stdout: f.close()
Но это кажется немного многословным и напоминает мне слишком много Java, которое, как правило, наверное, возможно, это не Питон Отказ
Я мог бы написать Контекстный менеджер Чтобы скрыть «Проверьте, если это stdout и закрыть его» Логика:
from contextlib import contextmanager @contextmanager def file_or_stdout(fname): if fname: f = open(fname, 'w') yield f f.close() else: yield sys.stdout with file_or_stdout(filename) as file: do_something(file)
Это кажется довольно ясно, но это также может быть излишним. Я прилагаю к этому, хотя, как оставляет do_something
Блок много места для ясности, и я мог извлечь file_or_stdout
Функция в утилиту библиотеку, поэтому она не загромождает файл.
Есть предположения?
Оригинал: “https://dev.to/cathodion/how-would-you-rewrite-this-python-code-27lc”