Откуда это взялось: - * - кодировка: utf-8 - * -

135

Python распознает следующее как инструкцию, которая определяет кодировку файла:

# -*- coding: utf-8 -*-

Я определенно видел такие инструкции до ( -*- var: value -*-). От куда это? Что такое полная спецификация, например, может ли значение включать пробелы, специальные символы, символы новой строки и даже -*-себя?

Моя программа будет писать простые текстовые файлы, и я хотел бы включить в них некоторые метаданные, используя этот формат.

hamstergene
источник
3
Это легче запомнить и работает в моем редакторе PyCharm. # coding: utf-8
crizCraig
2
Использование # coding: utf8работает из коробки с Python 2.7, даже вне PyCharm. (Я использую SublimeText).
Basj
1
@Cbhihe Этот вопрос не о Python, не о том, что делает инструкция или как она работает. Он спрашивает, какое программное обеспечение, предшествующее Python, изобрело его и есть ли в нем что-то большее, чем просто кодирование файлов.
hamstergene

Ответы:

89

Этот способ указания кодировки файла Python взят из PEP 0263 - Определение кодировки исходного кода Python .

Он также распознается GNU Emacs (см. Справочник по языку Python, 2.1.4 Объявления о кодировке ), хотя я не знаю, была ли это первая программа, использующая этот синтаксис.

Андреа Спадаччини
источник
4
Из того, что я могу заключить из руководства Emacs, значение может быть любым выражением LISP, в частности, строкой в ​​двойных кавычках
hamstergene
Спасибо за ссылку. Раньше у меня создалось впечатление, что директива использовалась только текстовым редактором. До сих пор я никогда не знал, что интерпретатор python фактически анализировал комментарий, если он присутствует в первых двух строках файла.
umeboshi
15

# -*- coding: utf-8 -*-это Python 2 вещь. В Python 3+ кодировка исходных файлов по умолчанию уже UTF-8, и эта строка бесполезна.

Смотрите: Должен ли я использовать объявление кодировки в Python 3?

pyupgrade- это инструмент, который вы можете запустить в своем коде, чтобы удалить эти комментарии и другие бесполезные остатки от Python 2, например, все ваши классы унаследованы от object.

Борис
источник
8

Это так называемые файловые локальные переменные, которые понимаются Emacs и устанавливаются соответственно. См. Соответствующий раздел в руководстве Emacs - вы можете определить их либо в заголовке, либо в нижнем колонтитуле файла.

Алекс Отт
источник
Этот специфический тип локальной переменной файла также понимается самим интерпретатором Python, он не только для текстовых редакторов. stackoverflow.com/questions/41680533/…
Борис
4

В PyCharm я бы его не упомянул. Выключает индикатор UTF-8 внизу с предупреждением о жестком кодировании. Не думайте, что вам нужен комментарий PyCharm, упомянутый выше.

cwp393
источник
на самом деле, если я поставлю такую ​​строку, test1 = 'äöü'это поможет вам добавить такой заголовок в файл. (pycharm 2019.1)
Cutton Eye
@ Cutton Eye это что-то с Python 2 или 3?
Борис