Herramienta para convertir código Python para que sea compatible con PEP8

113

Sé que hay herramientas que validan si su código Python es compatible con PEP8, por ejemplo, hay un servicio en línea y un módulo Python .

Sin embargo, no puedo encontrar un servicio o módulo que pueda convertir mi archivo Python en un archivo Python válido PEP8 autónomo. ¿Alguien sabe si hay alguno?
Supongo que es factible ya que PEP8 tiene que ver con la apariencia del código, ¿verdad?

Chen Xie
fuente
1
No creo que haya ninguna herramienta que convierta el código a código compatible con PEP8. PEP8 también incluía reglas de nomenclatura de variables, por lo que, si existe dicha herramienta, también cambiará el nombre de sus variables y es posible que no pueda comprender su propio código en ese momento.
Ashwini Chaudhary
1
@AshwiniChaudhary Ese es un buen punto, también vale la pena mencionar que cambiar los nombres de las variables puede afectar a otras personas que ya están usando su código, por lo que no siempre es una buena idea. (autopep8 no hace esto)
Andy Hayden

Respuestas:

38

Desafortunadamente, "pep8 storming" (todo el proyecto) tiene varios efectos secundarios negativos:

  • muchos conflictos de fusión
  • romper la culpa
  • dificultar la revisión del código

Como alternativa (y gracias a @yp por la idea ), escribí un pequeño paquete que autopep8s solo aquellas líneas en las que has estado trabajando desde la última confirmación / rama:

Básicamente, dejar el proyecto un poco mejor de lo que lo encontró :

pip install pep8radius

Suponga que ha terminado su trabajo mastery está listo para comprometerse:

# 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

O para limpiar las nuevas líneas que ha comprometido desde la última confirmación:

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

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

Básicamente, pep8radiusse aplica autopep8 a las líneas en la salida de git / hg diff (de la última confirmación compartida ).

Este script actualmente funciona con git y hg, si está usando otra cosa y quiere que esto funcione, por favor publique un comentario / problema / PR .

Andy Hayden
fuente
2
+1 muy buena iniciativa ... Estoy pensando en cómo hacer un complemento Notepad ++ para el mismo propósito ... ya que ese es mi editor favorito en Windows
kmonsoor
1
@kmonsoor buena idea, ¡no había pensado en los complementos del editor! Avísame en github de cualquier manera en la que pueda ayudar / facilitar el uso fuera de CLI ... Preveo algunos problemas (que se pueden resolver).
Andy Hayden
aquí encontré una lista interesante de complementos de editor github.com/jcrocholl/pep8/wiki/RelatedTools , aunque no tuve suerte para Notepad ++ ...
kmonsoor
1
Acabo de crear un script para crear un puente entre Notepad ++ y Autopep8, basándome en otro complemento "Python Script". Sin embargo, funciona. Por favor, compruebe aquí: bit.ly/pep8_tonizer
kmonsoor
184

¡Puedes usar autopep8 ! Mientras se prepara una taza de café, esta herramienta elimina felizmente todas esas molestas violaciones de PEP8 que no cambian el significado del código.

Instálelo a través de pip:

pip install autopep8

Aplicar esto a un archivo específico:

autopep8 py_file --in-place

o para su proyecto (recursivamente), la opción detallada le da algunos comentarios de cómo va :

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

Nota: A veces, el valor predeterminado de 100 pasadas no es suficiente, lo configuro en 2000 ya que es razonablemente alto y capturará todos los archivos menos los más problemáticos (deja de pasar una vez que no encuentra infracciones pep8 resolubles) ...

En este punto, sugiero volver a probar y hacer un compromiso.

Si desea un cumplimiento "total" de PEP8: una táctica que he usado es ejecutar autopep8 como se indicó anteriormente, luego ejecute PEP8, que imprime las infracciones restantes (archivo, número de línea y qué):

pep8 project_dir --ignore=E501

y cámbielos manualmente individualmente (por ejemplo, E712s - comparación con booleanos).

Nota: autopep8 ofrece un --aggressiveargumento (para "arreglar" despiadadamente estas violaciones que cambian de significado), pero tenga cuidado si usa agresivo, puede que tenga que depurar ... (por ejemplo, en numpy / pandas, ¡ True == np.bool_(True)pero no True is np.bool_(True)!)

Puede comprobar cuántas infracciones de cada tipo (antes y después):

pep8 --quiet --statistics .

Nota: Considero que los E501 (línea demasiado larga) son un caso especial, ya que probablemente habrá muchos de estos en su código y, a veces, autopep8 no los corrige.

Como ejemplo, apliqué esta técnica al código base de pandas .

Andy Hayden
fuente
@hayden ¿Tiene algún comentario sobre cuán confiable es esto y la proporción de correcciones automágicas y problemas extraños que presenta?
Marius
@Marius Usé esto en el código de pandas (que es bastante grande) y no mostró ningún problema extraño, no cambiará el código que cambia el significado , he actualizado mi respuesta para mencionarlos. Anteriormente tenía un problema con el hashbang de Sphinx (un error en PEP8 ahora corregido).
Andy Hayden
2
¿Esto hace cumplir Strunk y White en los comentarios?
Eric
1
A partir del 25 de octubre de 2017, pep8se cambió el nombre del paquete mencionado en esta respuesta a pycodestyle: github.com/PyCQA/pycodestyle/releases/tag/1.7.1
hb20007
8

@Andy Hayden dio una buena descripción general de autopep8. Además de eso, hay un paquete más llamado pep8ify que también hace lo mismo.

Sin embargo, ambos paquetes solo pueden eliminar los errores de pelusa, pero no pueden formatear el código.

little = more[3:   5]

El código anterior permanece igual después de pep8ificar también. Pero el código aún no se ve bien. Puede utilizar formateadores como yapf , que formatearán el código incluso si el código es compatible con PEP8. El código anterior se formateará para

little = more[3:5]

Algunas veces esto incluso destruye su formateo manual. Por ejemplo

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

será convertido a

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

Pero puedes decirle que ignore algunas partes.

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

Tomado de mi antigua publicación de blog: ¡ PEP8 automáticamente y formatee su código Python!

ChillarAnand
fuente
2
¿Es little = more[3: 5]un error en pep8 (la biblioteca)? yapf es definitivamente el futuro aquí, el algoritmo detrás de él (esencialmente una ruta más corta en el gráfico de todas las opciones de formato) es una solución muy elegante y probablemente tendrá menos errores, así como formato canónico.
Andy Hayden
@AndyHayden Parece que falta una característica, no soluciona E225
ChillarAnand
5

Si está utilizando eclipse + PyDev, simplemente puede activar autopep8 desde la configuración de PyDev: Windows -> Preferencias -> escriba 'autopep8' en el filtro de búsqueda.

Marque la casilla '¿usar autopep8.py para formatear el código?' -> Aceptar

Ahora el formato de código CTRL-SHIFT-F de eclipse debería formatear su código usando autopep8 :)

captura de pantalla

mork
fuente
3

Hice una amplia investigación sobre diferentes instrumentos para Python y estilo de código. Hay dos tipos de instrumentos: linters: analizan su código y dan algunas advertencias sobre estilos de código mal usados ​​y muestran consejos sobre cómo solucionarlo, y formateadores de código: cuando guarda su archivo, vuelve a formatear su documento usando el estilo PEP.

Debido a que el reformateo debe ser más preciso (si remorgrasa algo que no quieres que se vuelva inútil) cubren menos parte de PEP, los linters muestran mucho más.

Todos ellos tienen diferentes permisos de configuración, por ejemplo, pylinter configurable en todas sus reglas (puede activar / desactivar todo tipo de advertencias), negro inconfigurable en absoluto.

Aquí hay algunos enlaces útiles y tutoriales:

Documentación:

Linters (en orden de popularidad):

Formateadores de código (en orden de popularidad):

Mikhail_Sam
fuente
1

Hay muchos.

Los IDE suelen tener alguna capacidad de formateo incorporada. IntelliJ Idea / PyCharm sí, lo mismo ocurre con el complemento de Python para Eclipse, y así sucesivamente.

Hay formateadores / linters que pueden apuntar a varios idiomas. https://coala.io es un buen ejemplo de eso.

Luego están las herramientas de propósito único, de las cuales muchas se mencionan en otras respuestas.

Un método específico de reformateo automático es analizar el archivo en el árbol AST (sin dejar comentarios) y luego volcarlo de nuevo al texto (lo que significa que no se conserva nada del formato original). Ejemplo de eso sería https://github.com/python/black .

user7610
fuente