web-dev-qa-db-fra.com

Est-ce que '# - * - coding: utf-8 - * -' est aussi un commentaire en Python?

Comme nous utilisons # pour insérer des commentaires en Python, comment Python prend-il:

# -*- coding: utf-8 -*-

différemment?

50
Shravil Potdar

Oui, c'est aussi un commentaire. et le contenu de ce commentaire a une signification particulière s'il est situé en haut du fichier, dans les deux premières lignes.

À partir de la déclaration de codage documentation :

Si un commentaire dans la première ou deuxième ligne du script Python correspond à l'expression régulière coding[=:]\s*([-\w.]+), ce commentaire est traité comme une déclaration de codage; le premier groupe de cette expression nomme l'encodage du fichier de code source. La déclaration de codage doit apparaître sur une ligne distincte. S'il s'agit de la deuxième ligne, la première ligne doit également être une ligne de commentaire uniquement.

Notez que peu importe le codec à utiliser pour lire le fichier, en ce qui concerne les commentaires. Python ignorerait normalement tout après le jeton #, et dans tous les codecs de code source acceptés, le #, la déclaration d'encodage et la ligne les caractères de séparation sont codés exactement de la même manière qu’ils sont tous des sur-ensembles d’ASCII. Il suffit donc à l'analyseur de lire une ligne, de rechercher le texte spécial dans le commentaire, d'en lire une autre si nécessaire, de rechercher le commentaire, puis de configurer l'analyseur pour qu'il lise les données en fonction du codec donné.

Etant donné que le commentaire doit être le premier ou le deuxième dans le fichier (et s'il s'agit de la deuxième ligne, la première ligne doit également être un commentaire), cela est parfaitement sûr, car le codec configuré ne peut faire la différence lignes de non-commentaire de toute façon.

50
Martijn Pieters

Voir déclarations de codage dans le Python Manuel de référence:

Si un ( commentaire dans la première ou la deuxième ligne du script Python correspond l'expression régulière coding[=:]\s*([-\w.]+), ce commentaire est traité comme une déclaration de codage; le premier groupe de cette expression nomme l'encodage du fichier de code source.

(Mon accentuation)

Alors oui, c’est un commentaire, un commentaire spécial. Il a la particularité que l’analyseur essaiera d’agir en conséquence et ne l’ignorera pas comme il le fait pour les commentaires qui ne figurent ni à la première ni à la deuxième ligne. Prenons, par exemple, une déclaration de codage non enregistrée dans un fichier exemple decl.py:

# # -*- coding: unknown-encoding -*-
print("foo")

Si vous essayez et lancez ceci, Python va essayer de le traiter, échouer et se plaindre:

python decl.py 
  File "decl.py", line 1
SyntaxError: encoding problem: unknown-encoding
17