Рубрики
Без рубрики

Как бы вы переписали этот код Python?

Каждый, как я могу подумать о это либо слишком грязно, слишком многослой, либо сверхкил. Можете ли вы подумать лучше? Помечено Python, CodeReview, рефакторинг, обсуждение.

Я столкнулся с этой проблемой во время написания некоторых кода для задачи.

У меня есть некоторые Код Что я хочу написать в определенный файл, если предоставляется имя файла или стандартный выход, если нет:

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”