web-dev-qa-db-fra.com

Manière correcte de définir Python codage du code source

PEP 26 définit comment déclarer Python l'encodage du code source.

Normalement, les 2 premières lignes d'un fichier Python devrait commencer par:

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

Mais j'ai vu beaucoup de fichiers commençant par:

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

=> codant au lieu de codant .

Alors, quelle est la bonne façon de déclarer le codage de fichier?

Est-ce que l'encodage est autorisé car l'expression régulière utilisée est paresseuse? Ou s'agit-il simplement d'une autre forme de déclaration du codage de fichier?

Je pose cette question car le PEP ne parle pas de codage , il ne parle que de codage .

149
Oli

Vérifiez la documentation ici :

"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 d'encodage"

"Les formes recommandées de cette expression sont

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

qui est également reconnu par GNU Emacs, et

# vim:fileencoding=<encoding-name>

reconnu par le VIM de Bram Moolenaar. "

Donc, vous pouvez mettre à peu près n'importe quoi avant la partie "codage", mais vous devez vous en tenir à "codage" (sans préfixe) si vous voulez être compatible à 100% avec python-docs-recommendation.

Plus précisément, vous devez utiliser tout ce qui est reconnu par Python et le logiciel d'édition que vous utilisez (si nécessaire). Par exemple, la forme coding est reconnue (prête à l'emploi) par GNU Emacs mais pas Vim (oui, sans accord universel, c'est essentiellement un guerre de territoire ).

154
Rafał Dowgird

PEP 263:

la première ou la deuxième ligne doit correspondre à l'expression régulière "coding [: =]\s * ([-\w.] +)"

Alors, "encodage: UTF-8" allumettes.

PEP fournit quelques exemples:

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

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

Il suffit de copier coller ci-dessous l'instruction en haut de votre programme. Cela résoudra les problèmes d'encodage des caractères.

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

À partir d'aujourd'hui - juin 2018


PEP 26 lui-même mentionne la regex qui suit:

Pour définir un codage de code source, un commentaire magique doit être placé dans les fichiers source en tant que première ou deuxième ligne du fichier, par exemple:

# coding=<encoding name>

ou (en utilisant des formats reconnus par les éditeurs populaires):

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

ou:

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

Plus précisément, la première ou la deuxième ligne doit correspondre à l'expression régulière suivante:

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

Donc, comme déjà résumé par d’autres réponses, cela fera correspondre coding à n’importe quel préfixe, mais si vous souhaitez être aussi conforme à PEP que possible (même si, autant que je sache, utiliser encoding au lieu de coding ne viole en aucun cas PEP 263) - restez-y avec 'plain' coding, sans préfixe.

2
Filipp W.

Si je ne me trompe pas, la proposition initiale d'encodage du fichier source consistait à utiliser une expression régulière pour les deux premières lignes, ce qui autoriserait les deux.

Je pense que la regex était quelque chose du genre de coding: suivi de quelque chose.

J'ai trouvé ceci: http://www.python.org/dev/peps/pep-0263/ Quelle est la proposition originale, mais je n'arrive pas à trouver la spécification finale indiquant exactement ce qu'ils fait.

J'ai certainement utilisé encoding: à bon escient, alors évidemment cela fonctionne.

Essayez de changer quelque chose de complètement différent, comme duhcoding: ... pour voir si cela fonctionne aussi bien.

Je soupçonne que cela ressemble à Ruby - l'une ou l'autre méthode est acceptable.

Cela est dû en grande partie au fait que différents éditeurs de texte utilisent différentes méthodes (c’est-à-dire ces deux méthodes) d’encodage du marquage.

Avec Ruby, aussi longtemps que la première, ou la seconde s'il y a une ligne Shebang contient une chaîne qui correspond à:

coding: encoding-name

et en ignorant les espaces blancs et autres peluches sur ces lignes. (Cela peut souvent être un = au lieu de: aussi).

0