Bonne façon de définir l'encodage du code source Python

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

normalement, les 2 premières lignes d'un fichier Python doivent commencer par:

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

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

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

=> encodage au lieu de codage .

Quelle est donc la bonne façon de déclarer l'encodage du fichier?

Est encodage permis en raison de l'expression régulière utilisée est paresseux? Ou est-ce une autre forme de déclaration de l'encodage du fichier?

je pose cette question parce que le PEP ne parle pas de encodage , il parle juste de codage .

132
demandé sur Filipp W. 2009-04-08 11:35:05

6 réponses

Vérifier les docs 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 reconnu aussi par GNU Emacs, et

# vim:fileencoding=<encoding-name>

qui est reconnu par la VIM de Bram Moolenaar."

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

plus spécifiquement, vous devez utiliser tout ce qui est reconnu par Python et le logiciel d'édition spécifique que vous utilisez (s'il a besoin/accepte quoi que ce soit). Par exemple: la forme coding est reconnue (out of the box) par GNU Emacs mais pas Vim (oui, sans accord universel, il s'agit essentiellement d'une guerre de territoire ).

144
répondu Rafał Dowgird 2016-02-23 12:01:30

PEP 263:

la première ou la deuxième ligne doit correspondre à régulier expression " codage [:=]\S*([- \W.]+)"

évidemment " en codage: UTF-8 correspond.

PEP donne quelques exemples:

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

      # This Python file uses the following encoding: utf-8
      import os, sys
34
répondu vartec 2009-04-08 08:21:12

il suffit de copier coller la déclaration ci-dessous sur le haut de votre programme.Il va résoudre des problèmes d'encodage de caractères

#!/usr/bin/env python
# -*- coding: utf-8 -*-
21
répondu Harun ERGUL 2016-03-22 19:28:47

si Je ne me trompe pas, la proposition originale d'encodage de fichier source était d'utiliser une expression régulière pour les deux premières lignes, ce qui permettrait les deux.

je pense que le regex était quelque chose du genre coding: suivi de quelque chose.

j'ai trouvé ça: http://www.python.org/dev/peps/pep-0263 / C'est la proposition originale, mais je ne trouve pas le cahier des charges final indiquant exactement ce qu'ils ont fait.

j'ai certainement utilisé encoding: pour grand effet, donc évidemment que cela fonctionne.

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

1
répondu Lasse Vågsæther Karlsen 2009-04-08 07:46:39

en date d'aujourd'hui-juin 2018


PEP 263 lui-même mentionne le regex il suit:

pour définir un encodage de code source, un commentaire magique doit être placé dans les fichiers source soit comme première ou deuxième ligne dans le fichier, tels que:

# 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, il va faire correspondre coding avec n'importe quel préfixe, mais si vous souhaitez être aussi conforme à PEP qu'il obtient (même si, autant que je peux dire, en utilisant encoding au lieu de coding ne viole PEP en aucune façon)-stick avec 'plain' coding , sans préfixes.

1
répondu Filipp W. 2018-06-25 08:13:02

je soupçonne qu'il est similaire à Ruby - l'une ou l'autre méthode est acceptable.

cela est dû en grande partie au fait que les différents éditeurs de texte utilisent des méthodes différentes (c'est-à-dire ces deux-là) pour marquer l'encodage.

avec Ruby, aussi longtemps que le premier, ou le second s'il y a une ligne shebang contient une chaîne qui correspond:

coding: encoding-name

et en ignorant tout espace blanc et autres peluches sur ces lignes. (Il peut souvent être un = au lieu de :, trop).

0
répondu Matthew Schinckel 2009-04-08 07:43:34