Manera correcta de definir la encoding del código fuente de Python

PEP 263 define cómo declarar la encoding del código fuente de Python.

Normalmente, las primeras 2 líneas de un archivo de Python deberían comenzar con:

#!/usr/bin/python # -*- coding:  -*- 

Pero he visto muchos archivos comenzando con:

 #!/usr/bin/python # -*- encoding:  -*- 

=> encoding en lugar de encoding .

Entonces, ¿cuál es la forma correcta de declarar la encoding del archivo?

¿Se permite la encoding porque la expresión regular utilizada es perezosa? ¿O es simplemente otra forma de declarar la encoding del archivo?

Estoy haciendo esta pregunta porque el PEP no habla de encoding , solo habla de encoding .

Revisa los documentos aquí :

“Si un comentario en la primera o segunda línea del script de Python coincide con la coding[=:]\s*([-\w.]+) expresión regular coding[=:]\s*([-\w.]+) , Este comentario se procesa como una statement de encoding”

“Las formas recomendadas de esta expresión son

 # -*- coding:  -*- 

que también es reconocido por GNU Emacs, y

 # vim:fileencoding= 

que es reconocido por Vram de Bram Moolenaar “.

Por lo tanto, puede poner prácticamente cualquier cosa antes de la parte de “encoding”, pero seguir con la “encoding” (sin prefijo) si desea ser compatible con la recomendación de Python-docs al 100%.

Más específicamente, necesita usar lo que sea reconocido por Python y el software de edición específico que use (si necesita / acepta algo). Por ejemplo, GNU Emacs reconoce la forma de coding (fuera de la caja) pero no Vim (sí, sin un acuerdo universal, es esencialmente una guerra territorial ).

PEP 263:

la primera o la segunda línea deben coincidir con la expresión regular “codificando [: =] \ s * ([- \ w.] +)”

Entonces, “en coding: UTF-8 ” coincide.

PEP proporciona algunos ejemplos:

 #!/usr/bin/python # vim: set fileencoding= : 

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

Simplemente copie la siguiente frase en la parte superior de su progtwig. Resolverá los problemas de encoding de caracteres

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

A partir de hoy – junio 2018


La propia PEP 263 menciona la expresión regular que sigue:

Para definir una encoding de código fuente, se debe colocar un comentario mágico en los archivos de origen como primera o segunda línea del archivo, como por ejemplo:

 # coding= 

o (utilizando formatos reconocidos por editores populares):

 #!/usr/bin/python # -*- coding:  -*- 

o:

 #!/usr/bin/python # vim: set fileencoding= : 

Más precisamente, la primera o la segunda línea debe coincidir con la siguiente expresión regular:

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

Así que, como ya se ha resumido en otras respuestas, coincidirá la coding con cualquier prefijo, pero si desea ser tan compatible con PEP como sea posible (aunque, por lo que puedo decir, utilice la encoding lugar de la coding no viola la PEP 263 de ninguna manera) – se adhiere a la coding ‘simple’, sin prefijos.

Si no me equivoco, la propuesta original para las codificaciones de los archivos de origen era usar una expresión regular para el primer par de líneas, lo que permitiría ambas.

Creo que la expresión regular era algo parecido a la coding: seguido de algo.

Encontré esto: http://www.python.org/dev/peps/pep-0263/, que es la propuesta original, pero parece que no puedo encontrar la especificación final que indique exactamente lo que hicieron.

Ciertamente he usado la encoding: con gran efecto, por lo que obviamente funciona.

Intente cambiar a algo completamente diferente, como duhcoding: ... para ver si funciona igual de bien.

Sospecho que es similar a Ruby, cualquiera de los dos métodos está bien.

Esto se debe en gran parte a que diferentes editores de texto utilizan diferentes métodos (es decir, estos dos) para marcar la encoding.

Con Ruby, siempre que la primera o la segunda, si hay una línea shebang, contenga una cadena que coincida:

 coding: encoding-name 

e ignorando cualquier espacio en blanco y otras pelusas en esas líneas. (A menudo puede ser un = en lugar de: también).