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 .
#!/usr/bin/env python
em vez de#!/usr/bin/python
ascii
paraUTF-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 especificarUTF-8
.Respostas:
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
que também é reconhecido pelo GNU Emacs, e
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
coding
formulário é reconhecido (fora da caixa) pelo GNU Emacs, mas não pelo Vim (sim, sem um acordo universal, é essencialmente uma guerra de território ).fonte
-*-
?-*-
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).<prefix>-*- var: value[; ...] -*-
.PEP 263:
Então, "en coding: UTF-8 " corresponde.
O PEP fornece alguns exemplos:
fonte
Basta copiar e colar a declaração abaixo na parte superior do seu programa. Isso resolverá problemas de codificação de caracteres
fonte
Até hoje - junho de 2018
O próprio PEP 263 menciona o regex a seguir:
Portanto, como já foi resumido por outras respostas, ele corresponderá
coding
a qualquer prefixo, mas se você quiser ser o mais compatível com o PEP possível (embora, tanto quanto eu saiba, o uso emencoding
vez decoding
não viole PEP 263 de qualquer forma) - use 'plain'coding
, sem prefixos.fonte
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.fonte
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:
e ignorando qualquer espaço em branco e outras penugens nessas linhas. (Geralmente, pode ser um = em vez de:).
fonte