Maneira correta de definir a codificação do código fonte do Python

163

O PEP 263 define como declarar a codificação do código fonte do Python.

Normalmente, as 2 primeiras linhas de um arquivo Python devem começar com:

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

Mas já vi muitos arquivos começando com:

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

=> codificação em vez de codificação .

Então, qual é a maneira correta de declarar a codificação de arquivo?

A codificação é permitida porque o regex usado é lento? Ou é apenas outra forma de declarar a codificação do arquivo?

Estou fazendo essa pergunta porque o PEP não fala sobre codificação , apenas fala sobre codificação .

Oli
fonte
4
By the way, há mais flexibilidade e portabilidade é recomendado o uso #!/usr/bin/env pythonem vez de#!/usr/bin/python
glarrain
7
Eu amo o jeito que nenhuma das respostas nesta página tem um exemplo simples e prático para dizer UTF8. StackOverly no seu melhor.
aaa90210
2
Eu só queria acrescentar que o Python 3 alterou a codificação padrão de asciipara UTF-8. Compare: documentos python 2.7 com documentos python 3.7 . Isso significa que você pode omitir com segurança essa codificação, se desejar especificar UTF-8.
gertvdijk 12/02/19

Respostas:

161

Confira os documentos aqui :

"Se um comentário na primeira ou segunda linha do script Python corresponder à expressão regular coding[=:]\s*([-\w.]+), esse comentário será processado como uma declaração de codificação"

"As formas recomendadas desta expressão são

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

que também é reconhecido pelo GNU Emacs, e

# vim:fileencoding=<encoding-name>

que é reconhecido pelo VIM de Bram Moolenaar ".

Portanto, você pode colocar praticamente qualquer coisa antes da parte "coding", mas use "coding" (sem prefixo) se quiser ser 100% compatível com python-docs-recomendação.

Mais especificamente, você precisa usar o que é reconhecido pelo Python e o software de edição específico que você usa (se precisar / aceitar qualquer coisa). Por exemplo, o codingformulário é reconhecido (fora da caixa) pelo GNU Emacs, mas não pelo Vim (sim, sem um acordo universal, é essencialmente uma guerra de território ).

Rafał Dowgird
fonte
10
Por que o -*-?
Iulian Onofrei 29/03/2015
10
Os -*-garante que a linha é reconhecida pelo GNU Emacs (editor de texto popular com alguns programadores). Observe que, ao contrário desta resposta, o formulário Emacs e o formulário Vim são 100% compatíveis com recomendação de python-docs (pois ambos correspondem ao regexp - "match", por convenção de longa data, significa "corresponder a qualquer lugar do string ", ao contrário da API do Python).
martinjs
1
Os requisitos específicos do Emacs para diretivas incorporadas estão documentados em gnu.org/software/emacs/manual/html_node/emacs/… . Em resumo, o formato para o início do arquivo é: <prefix>-*- var: value[; ...] -*-.
ivan_pozdeev 23/02
38

PEP 263:

a primeira ou a segunda linha deve corresponder à expressão regular "coding [: =] \ s * ([- \ w.] +)"

Então, "en coding: UTF-8 " corresponde.

O PEP fornece alguns exemplos:

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

 

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

Basta copiar e colar a declaração abaixo na parte superior do seu programa. Isso resolverá problemas de codificação de caracteres

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

Até hoje - junho de 2018


O próprio PEP 263 menciona o regex a seguir:

Para definir uma codificação de código-fonte, um comentário mágico deve ser colocado nos arquivos de origem como primeira ou segunda linha no arquivo, como:

# coding=<encoding name>

ou (usando formatos reconhecidos por editores populares):

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

ou:

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

Mais precisamente, a primeira ou a segunda linha deve corresponder à seguinte expressão regular:

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

Portanto, como já foi resumido por outras respostas, ele corresponderá codinga qualquer prefixo, mas se você quiser ser o mais compatível com o PEP possível (embora, tanto quanto eu saiba, o uso em encodingvez de codingnão viole PEP 263 de qualquer forma) - use 'plain' coding, sem prefixos.


fonte
1

Se não me engano, a proposta original para codificações de arquivos de origem era usar uma expressão regular para as duas primeiras linhas, o que permitiria ambas.

Eu acho que o regex era algo parecido com o coding:seguido por algo.

Encontrei o seguinte: http://www.python.org/dev/peps/pep-0263/ Qual é a proposta original, mas não consigo encontrar a especificação final informando exatamente o que eles fizeram.

Eu certamente já usei encoding:muito bem, então obviamente isso funciona.

Tente mudar para algo completamente diferente, gostaria duhcoding: ...de ver se isso também funciona.

Lasse V. Karlsen
fonte
0

Eu suspeito que é semelhante ao Ruby - qualquer um dos métodos está bem.

Isso ocorre principalmente porque editores de texto diferentes usam métodos diferentes (ou seja, esses dois) de codificação de marcação.

Com Ruby, desde que o primeiro ou o segundo, se houver uma linha shebang, contenha uma sequência que corresponda:

coding: encoding-name

e ignorando qualquer espaço em branco e outras penugens nessas linhas. (Geralmente, pode ser um = em vez de:).

Matthew Schinckel
fonte