Forma correcta de definir la codificación del código fuente de Python

163

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

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

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

Pero he visto muchos archivos que comienzan con:

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

=> codificación en lugar de codificación .

Entonces, ¿cuál es la forma correcta de declarar la codificación del archivo?

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

Estoy haciendo esta pregunta porque el PEP no habla de codificación , solo habla de codificación .

Oli
fuente
44
Por cierto, para mayor flexibilidad y portabilidad, se recomienda usar en #!/usr/bin/env pythonlugar de#!/usr/bin/python
glarrain
77
Me encanta la forma en que ninguna de las respuestas en esta página tiene un ejemplo simple y funcional para decir UTF8. StackOverly en su máxima expresión.
aaa90210
2
Solo quería agregar que Python 3 ha cambiado la codificación predeterminada de asciia UTF-8. Compare: documentos de python 2.7 con documentos de python 3.7 . Esto significa que puede omitir esta codificación de forma segura si desea especificar UTF-8.
gertvdijk

Respuestas:

161

Consulta los documentos aquí :

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

"Las formas recomendadas de esta expresión son

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

que también es reconocido por GNU Emacs, y

# vim:fileencoding=<encoding-name>

que es reconocido por VIM de Bram Moolenaar ".

Por lo tanto, puede poner casi cualquier cosa antes de la parte de "codificación", pero manténgase en "codificación" (sin prefijo) si desea ser 100% compatible con python-docs-advice.

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

Rafał Dowgird
fuente
10
¿Por qué el -*-?
Iulian Onofrei
10
Esto -*-asegura que la línea sea reconocida por GNU Emacs (un editor de texto popular entre algunos programadores). Tenga en cuenta que, contrariamente a esta respuesta, tanto el formulario Emacs como el formulario Vim son 100% compatibles con python-docs-recomendación (ya que ambos coinciden con la expresión regular - "coincidencia", por convención de larga data, significa "coincidencia en cualquier lugar del cadena ", contrario a la API de Python).
martinjs
1
Los requisitos específicos de Emacs para las directivas integradas se documentan en gnu.org/software/emacs/manual/html_node/emacs/… . En resumen, el formato para el inicio del archivo es: <prefix>-*- var: value[; ...] -*-.
ivan_pozdeev
38

PEP 263:

la primera o segunda línea debe coincidir con la expresión regular "codificación [: =] \ s * ([- \ w.] +)"

Entonces, "en coding: UTF-8 " coincide.

PEP proporciona algunos ejemplos:

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

 

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

Simplemente copie la siguiente instrucción pegar en la parte superior de su programa. Resolverá los problemas de codificación de caracteres

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

A partir de hoy - junio de 2018


El PEP 263 mismo menciona la expresión regular que sigue:

Para definir una codificación de código fuente, se debe colocar un comentario mágico en los archivos fuente como primera o segunda línea en el archivo, como:

# coding=<encoding name>

o (usando formatos reconocidos por editores populares):

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

o:

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

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

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

Entonces, como ya lo resumieron otras respuestas, coincidirá codingcon cualquier prefijo, pero si desea cumplir con la PEP lo más posible (aunque, por lo que puedo decir, usar en encodinglugar de codingno viola PEP 263 de cualquier manera): quédese con 'simple' coding, sin prefijos.


fuente
1

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

Creo que la expresión regular fue algo en la línea de coding:seguido por algo.

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

Ciertamente he usado encoding:un gran efecto, así que obviamente eso funciona.

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

Lasse V. Karlsen
fuente
0

Sospecho que es similar a Ruby: cualquier método está bien.

Esto se debe principalmente a que diferentes editores de texto usan diferentes métodos (es decir, estos dos) para marcar la codificación.

Con Ruby, siempre que el primero o el segundo si hay una línea shebang contenga una cadena que coincida con:

coding: encoding-name

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

Matthew Schinckel
fuente