Richtige Definition der Python-Quellcode-Codierung

163

PEP 263 definiert, wie die Python-Quellcode-Codierung deklariert wird.

Normalerweise sollten die ersten beiden Zeilen einer Python-Datei beginnen mit:

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

Aber ich habe viele Dateien gesehen, beginnend mit:

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

=> Kodierung statt Kodierung .

Wie kann die Dateicodierung korrekt deklariert werden?

Ist die Codierung zulässig, da der verwendete reguläre Ausdruck faul ist? Oder ist es nur eine andere Form, die Dateicodierung zu deklarieren?

Ich stelle diese Frage, weil der PEP nicht über Codierung spricht, sondern nur über Codierung .

Oli
quelle
4
Übrigens, für mehr Flexibilität und Portabilität wird empfohlen, #!/usr/bin/env pythonanstelle von#!/usr/bin/python
glarrain
7
Ich mag die Art und Weise, wie keine der Antworten auf dieser Seite ein einfaches, funktionierendes Beispiel für beispielsweise UTF8 enthält. StackOverly vom Feinsten.
aaa90210
2
Ich wollte nur hinzufügen, dass Python 3 die Standardcodierung von asciiauf geändert hat UTF-8. Vergleichen Sie: Python 2.7-Dokumente mit Python 3.7-Dokumenten . Dies bedeutet, dass Sie diese Codierung sicher weglassen können, wenn Sie angeben möchten UTF-8.
Gertvdijk

Antworten:

161

Überprüfen Sie die Dokumente hier :

"Wenn ein Kommentar in der ersten oder zweiten Zeile des Python-Skripts mit dem regulären Ausdruck übereinstimmt coding[=:]\s*([-\w.]+), wird dieser Kommentar als Codierungsdeklaration verarbeitet."

"Die empfohlenen Formen dieses Ausdrucks sind

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

was auch von GNU Emacs anerkannt wird, und

# vim:fileencoding=<encoding-name>

was von Bram Moolenaars VIM erkannt wird. "

Sie können also so ziemlich alles vor den Teil "Codierung" stellen, aber bei "Codierung" (ohne Präfix) bleiben, wenn Sie 100% Python-Docs-Empfehlungskompatibel sein möchten.

Insbesondere müssen Sie alles verwenden, was von Python erkannt wird, und die spezifische Bearbeitungssoftware, die Sie verwenden (wenn sie überhaupt etwas benötigt / akzeptiert). ZB wird die codingForm von GNU Emacs (sofort) anerkannt, aber nicht von Vim (ja, ohne eine universelle Vereinbarung handelt es sich im Wesentlichen um einen Rasenkrieg ).

Rafał Dowgird
quelle
10
Warum das -*-?
Iulian Onofrei
10
Das -*-stellt sicher , dass die Leitung von GNU Emacs (ein Texteditor beliebt bei einigen Programmierern) erkannt wird. Beachten Sie, dass im Gegensatz zu dieser Antwort sowohl das Emacs-Formular als auch das Vim-Formular zu 100% mit Python-Docs-Empfehlungen kompatibel sind (da beide mit dem regulären Ausdruck übereinstimmen - "Übereinstimmung" bedeutet nach langjähriger Konvention "Übereinstimmung irgendwo in der." string ", im Gegensatz zu Pythons API).
Martinjs
1
Die spezifischen Emacs-Anforderungen für eingebettete Direktiven sind unter gnu.org/software/emacs/manual/html_node/emacs/… dokumentiert . Kurz gesagt, das Format für den Start der Datei lautet : <prefix>-*- var: value[; ...] -*-.
ivan_pozdeev
38

PEP 263:

Die erste oder zweite Zeile muss mit dem regulären Ausdruck "Kodierung [: =] \ s * ([- \ w.] +)" übereinstimmen.

"En Coding: UTF-8 " stimmt also überein.

PEP bietet einige Beispiele:

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

 

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

Kopieren Sie einfach die Anweisung unter Einfügen oben in Ihrem Programm. Dadurch werden Probleme bei der Zeichenkodierung gelöst

#!/usr/bin/env python
# -*- coding: utf-8 -*-
Harun ERGUL
quelle
3

Stand heute - Juni 2018


PEP 263 selbst erwähnt den regulären Ausdruck, dem es folgt:

Um eine Quellcode-Codierung zu definieren, muss ein magischer Kommentar entweder als erste oder zweite Zeile in der Datei in die Quelldateien eingefügt werden, z.

# coding=<encoding name>

oder (unter Verwendung von Formaten, die von bekannten Redakteuren erkannt werden):

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

oder:

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

Genauer gesagt muss die erste oder zweite Zeile mit dem folgenden regulären Ausdruck übereinstimmen:

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

Wie bereits in anderen Antworten zusammengefasst, stimmt es codingmit jedem Präfix überein , aber wenn Sie so PEP-konform wie möglich sein möchten (auch wenn, soweit ich das beurteilen kann, die Verwendung von encodinganstelle von codingnicht verletzt wird PEP 263 in irgendeiner Weise) - bleiben Sie bei 'plain' coding, ohne Präfixe.


quelle
1

Wenn ich mich nicht irre, bestand der ursprüngliche Vorschlag für die Codierung von Quelldateien darin, für die ersten Zeilen einen regulären Ausdruck zu verwenden, der beides zulässt.

Ich denke, der Regex war etwas in der Art von coding:gefolgt von etwas.

Ich habe Folgendes gefunden: http://www.python.org/dev/peps/pep-0263/ Dies ist der ursprüngliche Vorschlag, aber ich kann die endgültige Spezifikation nicht finden, in der genau angegeben ist, was sie getan haben.

Ich habe mich auf jeden Fall encoding:sehr gut bewährt, also funktioniert das offensichtlich.

Versuchen Sie, zu etwas völlig anderem zu wechseln, um duhcoding: ...zu sehen, ob das genauso gut funktioniert.

Lasse V. Karlsen
quelle
0

Ich vermute, es ist Ruby ähnlich - beide Methoden sind in Ordnung.

Dies liegt hauptsächlich daran, dass verschiedene Texteditoren unterschiedliche Methoden (dh diese beiden) zum Markieren der Codierung verwenden.

Mit Ruby, solange die erste oder zweite, wenn es eine Shebang-Zeile gibt, eine Zeichenfolge enthält, die übereinstimmt:

coding: encoding-name

und Ignorieren von Leerzeichen und anderen Flusen in diesen Zeilen. (Es kann oft auch ein = statt: sein).

Matthew Schinckel
quelle