Звідки це: - * - кодування: utf-8 - * -


135

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

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

Я напевно бачив подібні інструкції раніше ( -*- var: value -*-). Звідки воно походить? Що таке повна специфікація, наприклад, чи може значення включати пробіли, спеціальні символи, нові рядки, навіть -*-саме себе?

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


3
Це простіше запам'ятати і працює в моєму редакторі PyCharm. # coding: utf-8
crizCraig

2
Використання # coding: utf8робіт із програми Python 2.7 навіть поза межами PyCharm. (Я використовую SublimeText).
Бась


1
@Cbhihe Це питання не про Python, а не про те, що робить інструкція чи як вона працює. Це питання, яке програмне забезпечення перед Python винайшло, і чи є в ньому більше, ніж просто кодування файлів.
hamstergene

Відповіді:


89

Цей спосіб визначення кодування файлу Python походить від PEP 0263 - Визначення кодування вихідного коду Python .

Це також розпізнається GNU Emacs (див. Довідник мови Python, 2.1.4 Кодування декларацій ), хоча я не знаю, чи була першою програмою, яка використовувала цей синтаксис.


4
З того, що я можу зробити висновок із посібника Emacs, значенням може бути будь-який вираз LISP, зокрема, рядок з подвійним цитуванням
hamstergene

Дякуємо за pep-посилання. Раніше я мав враження, що директиву використовував лише редактор тексту. До цього часу я ніколи не знав, що інтерпретатор python насправді розбирає коментар, якщо він присутній у перших двох рядках файлу.
умебоші

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, згаданий вище.


насправді, якщо я поставлю такий рядок, як test1 = 'äöü'він натякає вам на додавання такого заголовка до файлу. (pycharm 2019.1)
Cutton Eye

@Cutton Eye це з Python 2 або 3?
Борис
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.