Почему универсальный режим перевода строки не рекомендуется в Python?

26

Я только что заметил, что универсальная функция новой строки в файловых операциях, похоже, выходит из-под контроля.

Документация для Python 3.5 open«s modeпараметр указывает на то, что это не рекомендуется:

'U' универсальный режим новой строки (не рекомендуется)

По крайней мере, начиная с Python 3.2, openпри документировании использования modeаргумента содержится аналогичное предупреждение «только для обратной совместимости» :

'U' универсальный режим новой строки (для обратной совместимости; не должен использоваться в новом коде)

Даже в Python 2.7 подобное предупреждение помещено в документацию io.open.

В чем причина этого?

jpmc26
источник
2
Логика этого довольно проста. Считается более «питонским», чтобы называть вещи, а не безымянные вещи. Таким образом, вы используете именованный параметр, а не символьный флаг. Идея флага - это в значительной степени пережиток реализации Python на C, и неудивительно, что ее исключили.
Мировой инженер
Потому что файлы открываются в универсальном режиме новой строки по умолчанию.
Борис

Ответы:

37

open()Функция в библиотеке Python 3 имеет newlineаргумент. Установка его для Noneвключения универсальных переносов строк. Это приемлемый способ сделать это, сделав mode='U'аргумент избыточным.

Используйте newline=Noneдля включения универсального режима перевода строки (это значение по умолчанию).

Роберт Харви
источник
5
Похоже, я неправильно понял. Я прочитал это как высказывание о том, что универсальные переводы строк в целом устарели, а не только символ режима. Спасибо за разъяснение этого.
jpmc26
6

Наткнувшись на этот вопрос, я обновил документацию, чтобы прояснить, что происходит ( https://github.com/python/cpython/pull/11646/files ).

Запутанная загадочная запись в таблице 'U'исчезла, и вместо этого есть параграф, который гласит:

Разрешен дополнительный символ режима, 'U'который больше не имеет никакого эффекта и считается устаревшим. Ранее он включал: term: universal newlinesв текстовом режиме, который стал поведением по умолчанию в Python 3.0. Обратитесь к документации параметра: ref: newline <open-newline-parameter>для получения более подробной информации.

ncoghlan
источник