Ferramenta para converter o código Python para ser compatível com PEP8

113

Eu sei que existem ferramentas que validam se o seu código Python é compatível com PEP8, por exemplo, há um serviço online e um módulo python .

No entanto, não consigo encontrar um serviço ou módulo que possa converter meu arquivo Python em um arquivo Python válido PEP8 independente. Alguém sabe se existe algum?
Presumo que seja viável, já que o PEP8 tem tudo a ver com a aparência do código, certo?

Chen Xie
fonte
1
Não acho que exista nenhuma ferramenta que converta o código em código compatível com PEP8. O PEP8 também incluiu regras de nomenclatura de variáveis, portanto, se essa ferramenta existir, ela também renomeará seus nomes de variáveis ​​e talvez você não consiga entender seu próprio código.
Ashwini Chaudhary
1
@AshwiniChaudhary Esse é um bom ponto, também vale a pena mencionar que alterar os nomes das variáveis ​​pode afetar outras pessoas que já usam o seu código, portanto, nem sempre é uma boa ideia. (autopep8 não faz isso.)
Andy Hayden

Respostas:

38

Infelizmente, "pep8 storming" (todo o projeto) tem vários efeitos colaterais negativos:

  • muitos conflitos de fusão
  • quebrar a culpa
  • tornar a revisão do código difícil

Como alternativa (e graças a @yp pela ideia ), escrevi um pequeno pacote que autopep8s apenas as linhas nas quais você trabalhou desde o último commit / branch:

Basicamente, deixando o projeto um pouco melhor do que o encontrou :

pip install pep8radius

Suponha que você tenha feito seu trabalho mastere esteja pronto para se comprometer:

# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place

Ou para limpar as novas linhas que você cometeu desde o último commit:

pep8radius --diff
pep8radius --diff --in-place

# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff

Basicamente, pep8radiusé aplicar autopep8 às linhas na saída de git / hg diff (do último commit compartilhado ).

Este script atualmente funciona com git e hg, se você estiver usando outra coisa e quiser que isso funcione , poste um comentário / problema / PR !

Andy Hayden
fonte
2
+1 muito boa iniciativa ... estou pensando em como fazer um plugin Notepad ++ para o mesmo fim ... pois esse é meu editor favorito no Windows
kmonsoor
1
@kmonsoor boa ideia, não tinha pensado em plugins de editor! Deixe-me saber no github de qualquer maneira que eu possa ajudar / facilitar o uso fora da CLI ... Prevejo alguns problemas (resolvíveis).
Andy Hayden
aqui eu encontrei uma lista interessante de plug-ins do editor github.com/jcrocholl/pep8/wiki/RelatedTools , mas sem sorte para o Notepad ++ ...
kmonsoor
1
Acabei de criar um script para fazer a ponte entre o Notepad ++ e o Autopep8, baseado em outro plugin "Script Python". No entanto, funciona. Por favor,
kmonsoor
185

Você pode usar o autopep8 ! Enquanto você faz uma xícara de café, esta ferramenta felizmente remove todas as violações do PEP8 que não mudam o significado do código.

Instale-o via pip:

pip install autopep8

Aplique isso a um arquivo específico:

autopep8 py_file --in-place

ou para o seu projeto (recursivamente), a opção detalhada fornece algum feedback de como está indo :

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

Nota: Às vezes, o padrão de 100 passes não é suficiente, eu o defino para 2.000, pois é razoavelmente alto e pegará todos os arquivos, exceto os mais problemáticos (ele para de passar quando não encontra infrações pep8 resolvíveis) ...

Nesse ponto, sugiro testar novamente e fazer um commit!

Se você quiser conformidade PEP8 "total" : uma tática que usei é executar o autopep8 como acima e, em seguida, executar o PEP8, que exibe as violações restantes (arquivo, número da linha e o que):

pep8 project_dir --ignore=E501

e altere-os individualmente (por exemplo, E712s - comparação com booleano).

Nota: autopep8 oferece um --aggressiveargumento (para "consertar" impiedosamente essas violações de mudança de significado), mas cuidado se você usar agressivo, você pode ter que depurar ... (por exemplo, em numpy / pandas, True == np.bool_(True)mas não True is np.bool_(True)!)

Você pode verificar quantas violações de cada tipo (antes e depois):

pep8 --quiet --statistics .

Nota: Eu considero E501s (linha muito longa) são um caso especial, pois provavelmente haverá muitos deles em seu código e às vezes não são corrigidos pelo autopep8.

Como exemplo, apliquei essa técnica à base de código do pandas .

Andy Hayden
fonte
@hayden Você tem algum comentário sobre como isso é confiável e a proporção de correções de automagia para problemas estranhos que ele apresenta?
Marius
@Marius eu usei isso no código do pandas (que é muito grande) e não mostrou nenhum problema estranho, não vai mudar o código que muda o significado , eu atualizei minha resposta para mencioná-los. Anteriormente, havia um problema com o hashbang do Sphinx (um bug no PEP8 agora corrigido).
Andy Hayden
2
Isso reforça Strunk e White nos comentários?
Eric
1
Em 25 de outubro de 2017, o pep8pacote mencionado nesta resposta foi renomeado para pycodestyle: github.com/PyCQA/pycodestyle/releases/tag/1.7.1
hb20007
8

@Andy Hayden deu uma boa visão geral do autopep8. Além disso, há mais um pacote chamado pep8ify que também faz a mesma coisa.

No entanto, ambos os pacotes podem remover apenas erros de lint, mas não podem formatar o código.

little = more[3:   5]

O código acima permanece o mesmo após a pep8ificação também. Mas o código ainda não parece bom. Você pode usar formatadores como yapf , que formatará o código mesmo se o código for compatível com PEP8. O código acima será formatado para

little = more[3:5]

Algumas vezes, isso até destrói sua formatação manual. Por exemplo

BAZ = {
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
}

será convertido para

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

Mas você pode dizer a ele para ignorar algumas partes.

BAZ = {
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9, 10, 11, 12]
}  # yapf: disable

Retirado de minha antiga postagem no blog: Automaticamente PEP8 e formate seu código Python!

ChillarAnand
fonte
2
É little = more[3: 5]um bug no pep8 (a biblioteca)? yapf é definitivamente o futuro aqui, o algoritmo por trás dele (essencialmente um caminho mais curto no gráfico de todas as opções de formatação) é uma solução muito elegante e provavelmente terá menos bugs, bem como formatação canônica.
Andy Hayden
@AndyHayden Parece que falta um recurso, ele não corrige E225
ChillarAnand
5

Se você estiver usando o eclipse + PyDev, você pode simplesmente ativar o autopep8 nas configurações do PyDev: Windows -> Preferências -> digite 'autopep8' no filtro de pesquisa.

Verifique o 'use autopep8.py para formatação de código?' -> OK

Agora, a formatação de código CTRL-SHIFT-F do eclipse deve formatar seu código usando autopep8 :)

captura de tela

mork
fonte
3

Fiz uma ampla pesquisa sobre diferentes instrumentos para python e estilo de código. Existem dois tipos de instrumentos: linters - analisando seu código e dando alguns avisos sobre estilos de código mal usados ​​e mostrando conselhos sobre como corrigi-lo, e formatadores de código - quando você salva seu arquivo, ele reformata seu documento usando o estilo PEP.

Porque a reformatação deve ser mais precisa - se remorfat algo que você não quer que se torne inútil - eles cobrem menos parte do PEP, os linters mostram muito mais.

Todos eles têm diferentes permissões de configuração - por exemplo, pylinter configurável em todas as suas regras (você pode ligar / desligar todos os tipos de avisos), preto não configurável em tudo.

Aqui estão alguns links e tutoriais úteis:

Documentação:

Linters (em ordem de popularidade):

Formatadores de código (em ordem de popularidade):

Mikhail_Sam
fonte
1

Há muitos.

IDEs geralmente têm algum recurso de formatação embutido. IntelliJ Idea / PyCharm tem, o mesmo vale para o plug-in Python para Eclipse e assim por diante.

Existem formatadores / linters que podem ser direcionados a vários idiomas. https://coala.io é um bom exemplo disso.

Depois, há as ferramentas de propósito único, das quais muitas são mencionadas em outras respostas.

Um método específico de reformatação automática é analisar o arquivo na árvore AST (sem descartar comentários) e, em seguida, despejá-lo de volta no texto (o que significa que nada da formatação original é preservado). Um exemplo disso seria https://github.com/python/black .

usuário7610
fonte