Не заставляя flush
по умолчанию, вы оставляете это решение базовому объекту, в который пишете. Для sys.stdin
/ stderr
по умолчанию используется строка с буферизацией _io.TextIOWrapper
, что обычно соответствует ожиданиям интерактивной консоли. Когда вы меняете вывод для файла, значение по умолчанию не заставляет flush
при каждой печати / записи кажется разумным. И наоборот, принудительное выполнение flush
после каждой печати отменяет поведение буферизации / очистки базового объекта.
Очевидное предостережение, когда вы, например, запускаете свой скрипт через tee, process' own
stdout`, не записывает напрямую в терминал.
Я немного побродил, чтобы посмотреть, есть ли какие-либо текстовые свидетельства относительно мотивации. Добавление ключевого слова flush
задокументировано в выпуск 13761 . По-видимому, предложение по умолчанию True
для stdout
было сделано еще в 2012 году и отклонено (см. В нижней части обсуждения). Я полагаю, что именно здесь можно применить «Дзен Python»: «Особых случаев недостаточно, чтобы нарушать правила». (Никакой специальной обработки только потому, что мы пишем sys.stdout
;)
Существует также ссылка в списке рассылки, где сам BDFL заявляет:
Хорошо бы добавить новый аргумент ключевого слова для print () в
3.3 для принудительного сброса при условии, что по умолчанию он выключен.