Como han dicho otros, # coding:especifica la codificación en la que se guarda el archivo fuente. Aquí hay algunos ejemplos para ilustrar esto:
Un archivo guardado en el disco como cp437 (codificación de mi consola), pero sin codificación declarada
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
Salida:
File "C:\ex.py", line 1
SyntaxError: Non-ASCII character '\x81' in file C:\ex.py on line 1, but no
encoding declared; see http://www.python.org/peps/pep-0263.html for details
Salida de archivo con # coding: cp437agregado:
über '\x81ber'
über u'\xfcber'
Al principio, Python no sabía la codificación y se quejó del carácter no ASCII. Una vez que conocía la codificación, la cadena de bytes obtuvo los bytes que estaban realmente en el disco. Para la cadena Unicode, Python leyó \ x81, sabía que en cp437 eso era un ü , y lo decodificó en el punto de código Unicode para ü que es U + 00FC. Cuando se imprimió la cadena de bytes, Python envió el valor hexadecimal 81a la consola directamente. Cuando se imprimió la cadena Unicode, Python detectó correctamente la codificación de mi consola como cp437 y tradujo Unicode ü al valor cp437 para ü .
Esto es lo que sucede con un archivo declarado y guardado en UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
En UTF-8, ü se codifica como bytes hexadecimales C3 BC, por lo que la cadena de bytes contiene esos bytes, pero la cadena Unicode es idéntica al primer ejemplo. Python leyó los dos bytes y lo decodificó correctamente. Python imprimió la cadena de bytes incorrectamente, porque envió los dos bytes UTF-8 que representan ü directamente a mi consola cp437.
Aquí el archivo se declara cp437, pero se guarda en UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
La cadena de bytes todavía tenía los bytes en el disco (bytes hexadecimales UTF-8 C3 BC), pero los interpretó como dos caracteres cp437 en lugar de un solo carácter codificado en UTF-8. Esos dos caracteres se tradujeron a puntos de código Unicode, y todo se imprime incorrectamente.
# coding: utf8es lo suficientemente bueno, no es necesario-*-