Правильний спосіб визначення кодування вихідного коду Python


163

PEP 263 визначає, як оголосити кодування вихідного коду Python.

Зазвичай перші 2 рядки файлу Python повинні починатися з:

#!/usr/bin/python
# -*- coding: <encoding name> -*-

Але я бачив багато файлів, починаючи з:

#!/usr/bin/python
# -*- encoding: <encoding name> -*-

=> кодування замість кодування .

То який правильний спосіб оголошення кодування файлу?

Чи дозволено кодування, тому що використовуваний регулярний вираз лінивий? Або це просто ще одна форма оголошення кодування файлу?

Я задаю це питання, оскільки PEP не говорить про кодування , він просто говорить про кодування .


4
До речі, для більшої гнучкості та портативності рекомендується використовувати #!/usr/bin/env pythonзамість#!/usr/bin/python
glarrain

7
Мені подобається, що жодна з відповідей на цій сторінці не має простого, робочого прикладу, наприклад, UTF8. StackOverly в найкращих випадках.
aaa90210

2
Я просто хотів додати, що Python 3 змінив кодування за замовчуванням з asciiна UTF-8. Порівняйте: python 2,7 документа з python 3,7 документа . Це означає, що ви можете безпечно пропустити це кодування, якщо хочете вказати UTF-8.
gertvdijk

Відповіді:


161

Перевірте документи тут :

"Якщо коментар у першому чи другому рядку сценарію Python відповідає регулярному вираженню coding[=:]\s*([-\w.]+), цей коментар обробляється як кодування заяви"

"Рекомендовані форми цього виразу є

# -*- coding: <encoding-name> -*-

що визнано також GNU Emacs, і

# vim:fileencoding=<encoding-name>

який визнаний VIM Брема Муленара ".

Таким чином, ви можете поставити майже все, що перед частиною "кодування", але дотримуйтесь "кодування" (без префіксу), якщо ви хочете бути сумісними на 100% python-docs-рекомендації.

Більш конкретно, вам потрібно використовувати все, що розпізнається Python, і певне програмне забезпечення для редагування, яке ви використовуєте (якщо воно взагалі щось потребує / приймає). Наприклад, codingформа визнана (поза рамкою) GNU Emacs, але не Vim (так, без універсальної угоди це, по суті, дернова війна ).


10
Чому -*-?
Юліан Онофрей

10
У -*-гарантує , що лінія визнається GNU Emacs (текстовий редактор популярним з деякими програмістами). Зауважте, що, всупереч цій відповіді, і форма Emacs, і форма Vim є 100% -ними сумісними python-docs-рекомендаціями (оскільки вони обидва відповідають регулярному вираженню - "match", за давньою умовою, означає "збігатися в будь-якому місці в рядок ", всупереч API Python).
martinjs

1
Конкретні вимоги Emacs до вбудованих директив задокументовані на веб- сайті gnu.org/software/emacs/manual/html_node/emacs/… . Коротше кажучи, формат для початку файлу: <prefix>-*- var: value[; ...] -*-.
ivan_pozdeev

38

PEP 263:

перший або другий рядок повинен відповідати регулярному виразу "кодування [: =] \ s * ([- \ w.] +)"

Отже, "en кодування: UTF-8 " відповідає.

PEP надає кілька прикладів:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

 

# This Python file uses the following encoding: utf-8
import os, sys

31

Просто скопіюйте вставку під оператором у верхній частині програми. Він вирішить проблеми кодування символів

#!/usr/bin/env python
# -*- coding: utf-8 -*-

3

Станом на сьогодні - червень 2018 року


PEP 263 сам згадує наступний вираз:

Щоб визначити кодування вихідного коду, магічний коментар повинен бути розміщений у вихідних файлах як перший чи другий рядок у файлі, наприклад:

# coding=<encoding name>

або (використовуючи формати, визнані популярними редакторами):

#!/usr/bin/python
# -*- coding: <encoding name> -*-

або:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> : 

Точніше, перший або другий рядок повинен відповідати наступному регулярному виразу:

^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

Отже, як вже підсумовано в інших відповідях, він збігатиметься codingз будь-яким префіксом, але якщо ви хочете бути настільки сумісними з PEP, як це виходить (навіть, наскільки я можу сказати, використання encodingзамість codingне порушує PEP 263 будь-яким способом) - дотримуйтесь "звичайного" coding, без префіксів.


1

Якщо я не помиляюся, первісною пропозицією для кодування вихідних файлів було використання регулярного виразу для першої пари рядків, що дозволило б обом.

Я думаю, що регулярний вислів був чимось узгодженим coding:.

Я виявив це: http://www.python.org/dev/peps/pep-0263/ Це оригінальна пропозиція, але я не можу знайти остаточну специфікацію, яка б точно сказала, що вони зробили.

Я, безумовно, звик encoding:до чудового ефекту, так очевидно, що це працює.

Спробуйте перейти на щось зовсім інше, як duhcoding: ...побачити, чи працює це так само добре.


0

Я підозрюю, що він схожий на Рубі - будь-який метод є нормальним.

Це багато в чому тому, що різні текстові редактори використовують різні методи (тобто ці два) маркування кодування.

У Ruby, якщо перший або другий, якщо є рядок shebang, містить рядок, який відповідає:

coding: encoding-name

і ігноруючи будь-який пробіл та інший пух на цих лініях. (Часто це може бути а = замість: теж).

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