O título não deve ser editado para incluir pep8 como uma opção? No começo, eu pensei que vocês estavam falando sobre a proposição, não um pacote real de PyPI.
Ehtesh Choudhury
Respostas:
275
Bem, estou um pouco curioso, então acabei de testar os 3 logo após fazer a pergunta ;-)
Ok, esta não é uma revisão muito séria, mas aqui está o que posso dizer:
Tentei as ferramentas com as configurações padrão (é importante porque você pode escolher suas regras de verificação) no seguinte script:
#!/usr/local/bin/python# by Daniel Rosengren modified by e-satisimport sys, time
stdout = sys.stdout
BAILOUT =16
MAX_ITERATIONS =1000classIterator(object):def __init__(self):print'Rendering...'for y in xrange(-39,39):
stdout.write('\n')for x in xrange(-39,39):if self.mandelbrot(x/40.0, y/40.0):
stdout.write(' ')else:
stdout.write('*')def mandelbrot(self, x, y):
cr = y -0.5
ci = x
zi =0.0
zr =0.0for i in xrange(MAX_ITERATIONS):
temp = zr * zi
zr2 = zr * zr
zi2 = zi * zi
zr = zr2 - zi2 + cr
zi = temp + temp + ci
if zi2 + zr2 > BAILOUT:return i
return0
t = time.time()Iterator()print'\nPython Elapsed %.02f'%(time.time()- t)
Como um resultado :
PyCheckeré problemático porque compila o módulo para analisá-lo. Se você não deseja que seu código seja executado (por exemplo, ele executa uma consulta SQL), isso é ruim.
PyFlakesdeveria ser leve. De fato, decidiu que o código era perfeito. Estou procurando algo bastante grave, então acho que não vou fazê-lo.
PyLint foi muito falador e classificou o código 3/10 (OMG, eu sou um codificador sujo!).
Destaca pontos de PyLint:
Relatório muito descritivo e preciso.
Detecte alguns odores de código. Aqui, ele me disse para abandonar minha classe para escrever algo com funções porque a abordagem OO era inútil nesse caso específico. Algo que eu sabia, mas nunca esperava que um computador me dissesse :-p
O código totalmente corrigido roda mais rápido (sem classe, sem ligação de referência ...).
Feito por uma equipe francesa. Ok, não é uma vantagem para todos, mas eu gosto ;-)
Contras de PyLint:
Algumas regras são realmente rigorosas. Eu sei que você pode alterá-lo e que o padrão é corresponder ao PEP8, mas é um crime escrever 'para x em seq'? Aparentemente sim, porque você não pode escrever um nome de variável com menos de três letras. Eu vou mudar isso.
Muito, muito falador. Esteja pronto para usar seus olhos.
Script corrigido (com sequências de documentos preguiçosas e nomes de variáveis):
#!/usr/local/bin/python# by Daniel Rosengren, modified by e-satis"""
Module doctring
"""import time
from sys import stdout
BAILOUT =16
MAX_ITERATIONS =1000def mandelbrot(dim_1, dim_2):"""
function doc string
"""
cr1 = dim_1 -0.5
ci1 = dim_2
zi1 =0.0
zr1 =0.0for i in xrange(MAX_ITERATIONS):
temp = zr1 * zi1
zr2 = zr1 * zr1
zi2 = zi1 * zi1
zr1 = zr2 - zi2 + cr1
zi1 = temp + temp + ci1
if zi2 + zr2 > BAILOUT:return i
return0def execute():"""
func doc string
"""print'Rendering...'for dim_1 in xrange(-39,39):
stdout.write('\n')for dim_2 in xrange(-39,39):if mandelbrot(dim_1/40.0, dim_2/40.0):
stdout.write(' ')else:
stdout.write('*')
START_TIME = time.time()
execute()print'\nPython Elapsed %.02f'%(time.time()- START_TIME)
EDIT:
Graças a Rudiger Wolf, descobri pep8que faz exatamente o que o nome sugere: correspondência com o PEP8. Ele encontrou vários no-nos de sintaxe que o PyLint não encontrou. Mas PyLintencontrou coisas que não estavam especificamente ligadas ao PEP8, mas interessantes. Ambas as ferramentas são interessantes e complementares.
Eventualmente, usarei os dois, pois são realmente fáceis de instalar (por meio de pacotes ou ferramentas de instalação) e o texto de saída é muito fácil de encadear.
Para lhe dar uma pequena ideia do resultado deles:
pep8 :
./python_mandelbrot.py:4:11: E401 multiple imports on one line
./python_mandelbrot.py:10:1: E302 expected 2 blank lines, found 1./python_mandelbrot.py:10:23: E203 whitespace before ':'./python_mandelbrot.py:15:80: E501 line too long (108 characters)./python_mandelbrot.py:23:1: W291 trailing whitespace
./python_mandelbrot.py:41:5: E301 expected 1 blank line, found 3
PyLint :
*************Module python_mandelbrot
C:15:Line too long (108/80)
C:61:Line too long (85/80)
C:1:Missing docstring
C:5:Invalid name "stdout"(should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C:10:Iterator:Missing docstring
C:15:Iterator.__init__:Invalid name "y"(should match [a-z_][a-z0-9_]{2,30}$)
C:17:Iterator.__init__:Invalid name "x"(should match [a-z_][a-z0-9_]{2,30}$)[...]and a very long report with useful stats like :Duplication-----------+-------------------------+------+---------+-----------+||now |previous |difference |+=========================+======+=========+===========+|nb duplicated lines |0|0|=|+-------------------------+------+---------+-----------+|percent duplicated lines |0.000|0.000|=|+-------------------------+------+---------+-----------+
O objetivo dos pyflakes é analisar estaticamente seu código para garantir que não haja erros de nome ou variáveis / importações não utilizadas.
culebrón
4
Estou entendendo errado ou não há um ponto forte / fraco para o PyChecker nem o PyFlakes?
Wernight 29/03/12
17
"Pontos fortes: relatório muito descritivo e preciso." Qual relatório? Esta seção é sobre todas as ferramentas ou apenas uma?
ijk
3
Eu me pergunto. Eu obviamente escrevi todo o pró / contra apenas sobre o PyLint. Eu não tenho idéia do por que escrevi dessa maneira estúpida. Ressaca talvez? Desculpem rapazes.
e-satis
13
flake8 cobre ambos pyflakese pep8. Sugira fortemente que você use apenas um ou outro.
Ehtesh Choudhury
93
pep8 foi adicionado recentemente ao PyPi.
pep8 - Verificador de guia de estilo Python
pep8 é uma ferramenta para verificar seu código Python em relação a algumas das convenções de estilo no PEP 8.
Há um pacote melhor da IMO. flake8, combina os dois e adiciona complexidade condicional, funciona em diretórios e geralmente é bom.
DinGODzilla 9/10/12
11
Correr flake8pela primeira vez me ensinou que pulei direto para um projeto sem saber que o Python prefere fortemente os espaços por algum motivo. Eu tive que usar --ignore W191para tornar a saída útil.
CJM
3
Observe que as versões recentes do pep8agora são chamadas pycodestyle; consulte pypi.org/project/pycodestyle @cjm: python prefere fortemente espaços, porque é isso que é especificado nas diretrizes de estilo. Os espaços não são necessariamente superiores, mas a consistência em toda a comunidade é uma grande vantagem, e a comunidade decidiu por espaços.
Chris L. Barnes
Como melhor configuro meu editor (BBEdit ou vim) para usar espaços para Python e guias para absolutamente tudo o resto? Parece que (pelo menos para o BBEdit) é uma configuração global.
Cjm 05/09/19
11
@cjm No vim, você pode fazer :set et(abreviação de expandtabs) e depois :retabconverter todas as guias do buffer atual em espaços. Também pode ser útil para definir ts=4 sts=4 sw=4( tabstop, softtabstop, shiftwidth) primeiro. Quanto a uma abordagem geral, prefiro usar o editorconfig.org e seus plugins para definir as configurações corretas em um repositório, para que você não precise se preocupar em reconfigurar seu editor para diferentes bases de código.
Respostas:
Bem, estou um pouco curioso, então acabei de testar os 3 logo após fazer a pergunta ;-)
Ok, esta não é uma revisão muito séria, mas aqui está o que posso dizer:
Tentei as ferramentas com as configurações padrão (é importante porque você pode escolher suas regras de verificação) no seguinte script:
Como um resultado :
PyChecker
é problemático porque compila o módulo para analisá-lo. Se você não deseja que seu código seja executado (por exemplo, ele executa uma consulta SQL), isso é ruim.PyFlakes
deveria ser leve. De fato, decidiu que o código era perfeito. Estou procurando algo bastante grave, então acho que não vou fazê-lo.PyLint
foi muito falador e classificou o código 3/10 (OMG, eu sou um codificador sujo!).Destaca pontos de
PyLint
:Contras de
PyLint
:Script corrigido (com sequências de documentos preguiçosas e nomes de variáveis):
EDIT:
Graças a Rudiger Wolf, descobri
pep8
que faz exatamente o que o nome sugere: correspondência com o PEP8. Ele encontrou vários no-nos de sintaxe que o PyLint não encontrou. MasPyLint
encontrou coisas que não estavam especificamente ligadas ao PEP8, mas interessantes. Ambas as ferramentas são interessantes e complementares.Eventualmente, usarei os dois, pois são realmente fáceis de instalar (por meio de pacotes ou ferramentas de instalação) e o texto de saída é muito fácil de encadear.
Para lhe dar uma pequena ideia do resultado deles:
pep8 :
PyLint :
fonte
pyflakes
epep8
. Sugira fortemente que você use apenas um ou outro.pep8 foi adicionado recentemente ao PyPi.
Agora é super fácil verificar seu código no pep8.
Veja http://pypi.python.org/pypi/pep8
fonte
flake8
, combina os dois e adiciona complexidade condicional, funciona em diretórios e geralmente é bom.flake8
pela primeira vez me ensinou que pulei direto para um projeto sem saber que o Python prefere fortemente os espaços por algum motivo. Eu tive que usar--ignore W191
para tornar a saída útil.pep8
agora são chamadaspycodestyle
; consulte pypi.org/project/pycodestyle @cjm: python prefere fortemente espaços, porque é isso que é especificado nas diretrizes de estilo. Os espaços não são necessariamente superiores, mas a consistência em toda a comunidade é uma grande vantagem, e a comunidade decidiu por espaços.:set et
(abreviação deexpandtabs
) e depois:retab
converter todas as guias do buffer atual em espaços. Também pode ser útil para definirts=4 sts=4 sw=4
(tabstop
,softtabstop
,shiftwidth
) primeiro. Quanto a uma abordagem geral, prefiro usar o editorconfig.org e seus plugins para definir as configurações corretas em um repositório, para que você não precise se preocupar em reconfigurar seu editor para diferentes bases de código.