Cómo arreglar la sangría de Python

264

Tengo un código de Python que tiene una sangría inconsistente. Hay una gran cantidad de pestañas y espacios para empeorar la situación, e incluso no se conserva la sangría del espacio.

El código funciona como se esperaba, pero es difícil de mantener.

¿Cómo puedo arreglar la sangría (como HTML Tidy , pero para Python) sin romper el código?

Shay Erlichmen
fuente
¿puede revisar este enlace y proporcionar sus entradas sobre cómo usar el módulo reindent.py-- stackoverflow.com/questions/12132481/installing-reindent-python/…
user1050619
Como se menciona a continuación por @ andy-hayden, mire esta pregunta relacionada: básicamente autopep8proporciona sangría y mucho más: stackoverflow.com/questions/14328406/…
Pierz
2
Esta es una pregunta increíblemente útil, me encuentro necesitando hacer esto con bastante frecuencia. No se trata de "recomendar una herramienta" sino de "cómo hacerlo".
Andy Hayden

Respuestas:

282

Use el reindent.pyscript que encuentre en el Tools/scripts/directorio de su instalación de Python:

Cambie los archivos Python (.py) para usar sangrías de 4 espacios y no caracteres de tabulación dura. También recorte el exceso de espacios y pestañas de los extremos de las líneas, y elimine las líneas vacías al final de los archivos. También asegúrese de que la última línea termine con una nueva línea.

Eche un vistazo a ese script para obtener instrucciones detalladas de uso.

Alex Martelli
fuente
51
Desafortunadamente, no es parte de la instalación normal de Python en Debian y Ubuntu; Se divide en el python-examplespaquete.
ephemient
16
¡Excelente! Entonces, todo lo que los usuarios de Debian y Ubuntu necesitan hacer es apt-get ese paquete. Alternativamente, el script también está en svn.python.org/view/python/trunk/Tools/scripts/… .
Alex Martelli
9
@Shay Erlichmen: Prueba "python -tt yourscript.py"
nosklo
8
Los usuarios de Fedora / RedHat / CentOS deben instalar el paquete "python-tools".
Cristian Ciupitu
26
Solo para agregar al comentario de ephemient: una vez que python-examplesesté instalado, encontrará reindent en /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py.
Larry Hastings
59

Si estás usando Vim , mira :h retab.

                                                        *: ret * *: retab *
: [rango] ret [ab] [!] [nueva_tabstop]
                        Reemplace todas las secuencias de espacios en blanco que contengan un
                        <Tab> con nuevas cadenas de espacios en blanco utilizando el nuevo
                        Tabstop valor dado. Si no especifica un nuevo
                        tamaño de tabstop o es cero, Vim usa el valor actual
                        de 'tabstop'.
                        El valor actual de 'tabstop' siempre se usa para
                        Calcule el ancho de las pestañas existentes.
                        Con!, Vim también reemplaza cadenas de solo normal
                        espacios con pestañas cuando corresponda.
                        Con 'expandtab' activado, Vim reemplaza todas las pestañas con el
                        Número apropiado de espacios.
                        Este comando establece 'tabstop' al nuevo valor dado,
                        y si se realiza en todo el archivo, que es el predeterminado,
                        No debe hacer ningún cambio visible.
                        Cuidado: este comando modifica los caracteres <Tab>
                        dentro de cadenas en un programa en C. Use "\ t" para evitar
                        esto (es un buen hábito de todos modos).
                        ": retab!" También puede cambiar una secuencia de espacios por
                        <Tab> caracteres, que pueden estropear un printf ().
                        {no en Vi}
                        No disponible cuando | + ex_extra | la función fue deshabilitada en
                        tiempo de compilación.

Por ejemplo, si simplemente escribe

:retirado

todas tus pestañas se expandirán en espacios.

Es posible que desee

: se et "abreviatura de: set expandtab

para asegurarse de que las líneas nuevas no usarán pestañas literales.


Si no estás usando Vim,

perl -i.bak -pe "s / \ t / '' x (8-pos ()% 8) / eg" file.py

reemplazará las pestañas con espacios, suponiendo que las pestañas se detengan cada 8 caracteres, en file.py(con el original yendo a file.py.bak, por si acaso). Reemplace los 8 con 4 si sus tabulaciones son cada 4 espacios.

efímero
fuente
2
Funcionado bien. Esta es la forma más fácil de arreglar la mezcla de sangría de pestañas.
Srikant
Seguro que no es la forma más fácil.
CONvid19
52

Alcanzaría autopep8 para hacer esto:

$ # see what changes it would make
$ autopep8 path/to/file.py --select=E101,E121 --diff

$ # make these changes
$ autopep8 path/to/file.py --select=E101,E121 --in-place

Nota: E101 y E121 son sangría pep8 (creo que simplemente puede pasar --select=E1para solucionar todos los problemas relacionados con la sangría, aquellos que comienzan con E1).

Puede aplicar esto a todo su proyecto usando la bandera recursiva:

$ autopep8 package_dir --recursive --select=E101,E121 --in-place

Consulte también Herramienta para convertir código Python para que sea compatible con PEP8 .

Andy Hayden
fuente
esto es increíble ... He estado buscando una herramienta como rubycop de ruby ​​para python
OkezieE
1
autopep8falla si la sintaxis es incorrecta. puedes confirmar eso usandopython -tt <file.py>
Nishant
47

autopep8 -i script.py

Usa autopep8

autopep8 Formatea automáticamente el código de Python para cumplir con la PEP 8 nullstyleguía. Utiliza la pep8utilidad para determinar qué partes de las nullcodenecesidades deben formatearse. autopep8es capaz de solucionar la mayoría de los nullformattingproblemas que pueden ser reportados por pep8.

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file
CONvid19
fuente
solo tengo un código de línea con "import os" y 4 espacios antes, pero no es la sangría de ese ... cualquier razón por la cual
pkm
3
@pkm 4 espacios (o cualquier sangría que sea múltiplo de 4) es parte del PEP8
rbaleksandar
13

Usando Vim, no debería ser más complicado que golpear Esc, y luego escribir ...

:%s/\t/    /g

... en el archivo que desea cambiar. Eso convertirá todas las pestañas a cuatro espacios. Si también tiene un espaciado inconsistente, entonces será más difícil.

Ben Hughes
fuente
11
¿Puedes rastrear los codificadores originales y aplicar técnicas mejoradas de interrogación? No hay nada peor que un código sangrado inconsistente.
Ben Hughes
3
@Ben La sangría inconsistente es el menor de nuestros problemas de ese tipo :)
Shay Erlichmen
9

También hay PythonTidy (ya que dijiste que te gusta HTML Tidy).

Sin embargo, puede hacer mucho más que simplemente limpiar pestañas. Si te gusta ese tipo de cosas, vale la pena echarle un vistazo.

Paul Hildebrandt
fuente
5

En la mayoría de los sistemas tipo UNIX, también puede ejecutar:

expand -t4 oldfilename.py > newfilename.py

desde la línea de comando, cambiando el número si desea reemplazar las pestañas con una cantidad de espacios distintos a 4. Puede escribir fácilmente un script de shell para hacer esto con un montón de archivos a la vez, conservando los nombres de archivo originales.

Crowman
fuente
1
Tenga en cuenta que usar el mismo archivo no funciona y lo deja con un archivo vacío, pero esta respuesta realmente funciona y la uso cuando necesito convertir mis pestañas en espacios. ¿Alguien podría explicar el voto negativo? Lo subiré +1.
S. Kerdel
¿Hay alguna forma posible de recuperar el archivo sobrescrito? Acabo de usar el método anterior y el valor de mi día de código desapareció facepalm . Gracias
Simas
4

Si eres flojo (como yo), también puedes descargar una versión de prueba de Wingware Python IDE, que tiene una herramienta de reparación automática para sangría en mal estado. Funciona bastante bien http://www.wingware.com/

Yansky
fuente
4

El guión reindent no funcionó para mí, debido a que faltaba algún módulo. De todos modos, encontré este sedcomando que hace el trabajo perfecto para mí:

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py
Martin Vegter
fuente
2
Opciones ilegales -r.
HelloWorld
2

Prueba Emacs. Tiene buen soporte para la sangría necesaria en Python. Por favor, consulte este enlace http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm

Arnkrishn
fuente
2
python-mode es bueno para escribir Python, pero nada en el enlace describe cómo arreglar la sangría en un archivo existente.
ephemient
55
Mx untabify convertirá las pestañas en espacio en emacs
Paul Hildebrandt
El enlace está (efectivamente) roto. Redirige a una página con el título "Lenguaje de programación C para principiantes" (!).
Peter Mortensen
1

Pruebe IDLE y use Alt+ Xpara encontrar la sangría.

anshuman
fuente
0

Tengo una solución simple para este problema. Primero puede escribir ": retab" y luego ": retab!", Entonces todo estaría bien

hanqiang
fuente
1
Escriba " :retab" en qué contexto. En vim ?
Peter Mortensen