Modo corretto per definire la codifica del codice sorgente Python


163

PEP 263 definisce come dichiarare la codifica del codice sorgente Python.

Normalmente, le prime 2 righe di un file Python dovrebbero iniziare con:

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

Ma ho visto molti file che iniziano con:

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

=> codifica anziché codifica .

Quindi qual è il modo corretto di dichiarare la codifica dei file?

La codifica è consentita perché il regex utilizzato è pigro? O è solo un'altra forma di dichiarazione della codifica dei file?

Sto ponendo questa domanda perché il PEP non parla di codifica , ma solo di codifica .


4
A proposito, per maggiore flessibilità e portabilità si consiglia di utilizzare #!/usr/bin/env pythoninvece di#!/usr/bin/python
glarrain

7
Adoro il modo in cui nessuna delle risposte in questa pagina ha un esempio semplice e funzionante, ad esempio UTF8. StackOverly al suo meglio.
aaa90210

2
Volevo solo aggiungere che Python 3 ha cambiato la codifica predefinita da asciia UTF-8. Confronta: documenti Python 2.7 con documenti Python 3.7 . Ciò significa che è possibile omettere in modo sicuro questa codifica se si desidera specificare UTF-8.
gertvdijk,

Risposte:


161

Controlla i documenti qui :

"Se un commento nella prima o seconda riga dello script Python corrisponde all'espressione regolare coding[=:]\s*([-\w.]+), questo commento viene elaborato come una dichiarazione di codifica"

"Le forme consigliate di questa espressione sono

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

che è riconosciuto anche da GNU Emacs e

# vim:fileencoding=<encoding-name>

che è riconosciuto dal VIM di Bram Moolenaar ".

Quindi, puoi mettere praticamente qualsiasi cosa prima della parte "codifica", ma attenersi alla "codifica" (senza prefisso) se si desidera essere compatibili al 100% con Python Docs.

Più specificamente, è necessario utilizzare tutto ciò che è riconosciuto da Python e dal software di editing specifico che si utilizza (se ha bisogno / accetta qualcosa). Ad esempio, il codingmodulo è riconosciuto (out of the box) da GNU Emacs ma non da Vim (sì, senza un accordo universale, è essenzialmente una guerra in erba ).


11
Perché il -*-?
Iulian Onofrei,

10
Le -*-assicura che la linea è riconosciuto da GNU Emacs (un editor di testo popolare con alcuni programmatori). Si noti che, contrariamente a questa risposta, sia il modulo Emacs che il modulo Vim sono compatibili al 100% con Python-Docs-raccomandazione (poiché entrambi corrispondono al regexp - "match", per convenzione di lunga data, significa "match ovunque nel string ", contrariamente all'API di Python).
martinjs

1
I requisiti specifici di Emacs per le direttive integrate sono documentati su gnu.org/software/emacs/manual/html_node/emacs/… . In breve, il formato per l'inizio del file è: <prefix>-*- var: value[; ...] -*-.
ivan_pozdeev,

38

PEP 263:

la prima o la seconda riga devono corrispondere all'espressione regolare "coding [: =] \ s * ([- \ w.] +)"

Quindi, "en coding: UTF-8 " corrisponde.

PEP fornisce alcuni esempi:

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

 

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

31

Copia semplicemente la seguente istruzione incolla nella parte superiore del programma per risolvere i problemi di codifica dei caratteri

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

3

Ad oggi - giugno 2018


PEP 263 stesso menziona la regex che segue:

Per definire una codifica del codice sorgente, un commento magico deve essere inserito nei file sorgente come prima o seconda riga nel file, come ad esempio:

# coding=<encoding name>

oppure (utilizzando formati riconosciuti da editor popolari):

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

o:

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

Più precisamente, la prima o la seconda riga devono corrispondere alla seguente espressione regolare:

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

Quindi, come già riassunto da altre risposte, si abbinerà codinga qualsiasi prefisso, ma se desideri essere conforme a PEP come ottiene (anche se, per quanto ne so, usare encodinginvece di codingnon viola PEP 263 in qualsiasi modo) - mantieni il segno "normale" coding, senza prefissi.


1

Se non sbaglio, la proposta originale per la codifica dei file di origine era quella di utilizzare un'espressione regolare per la prima coppia di righe, che consentirebbe entrambe.

Penso che la regex fosse qualcosa sulla falsariga di coding:seguita da qualcosa.

Ho trovato questo: http://www.python.org/dev/peps/pep-0263/ Qual è la proposta originale, ma non riesco a trovare le specifiche finali che affermino esattamente cosa hanno fatto.

Ho sicuramente usato encoding: grandi risultati, quindi ovviamente funziona.

Prova a passare a qualcosa di completamente diverso, ad esempio duhcoding: ...per vedere se funziona altrettanto bene.


0

Sospetto che sia simile a Ruby: entrambi i metodi vanno bene.

Ciò è in gran parte dovuto al fatto che editor di testo diversi utilizzano metodi diversi (ovvero questi due) per contrassegnare la codifica.

Con Ruby, fintanto che il primo o il secondo se esiste una riga shebang contiene una stringa che corrisponde:

coding: encoding-name

e ignorando qualsiasi spazio bianco e altra lanugine su quelle linee. (Spesso può essere anche a = anziché:).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.