"Uso inconsistente de pestañas y espacios en sangría"

222

Estoy tratando de crear una aplicación en Python 3.2 y uso pestañas todo el tiempo para la sangría, pero incluso el editor cambia algunas de ellas en espacios y luego imprime "uso inconsistente de pestañas y espacios en sangría" cuando intento ejecutar el programa.

¿Cómo puedo cambiar los espacios en pestañas? Me esta volviendo loco. (Soy un principiante en programación). Me alegraría poder obtener algunos consejos generales sobre mi código; si he cometido muchos errores, me encantaría saberlo.

import random

attraktioner = ["frittfall","bergodalbana","spökhuset"]


class Nojesfalt:
    def __init__(self, attraktion):
        self.val = attraktion
        self.langd = 0
        self.alder = 0


#längdgräns för fritt fall
    def langdgrans(self):
        print("")
        self.langd = int(input("Hur lång är du i cm? "))
        if self.langd < 140:
            print("tyvärr, du är för kort, prova något annat")
            return 0
        elif self.langd >= 140:
            print("håll dig hatten, nu åker vi!")
            print(" ")
            return 1

#åldersgräns för spökhuset
    def aldersgrans(self):
        print("")
        self.alder = int(input("Hur gammal är du? "))
        if self.alder < 10:
            print("tyvärr, du är för ung, prova något annat")
            return 0
        elif self.alder >= 10:
            print("Gå in om du törs!")
            print(" ")
            return 1


#åker attraktion frittfall lr bergodalbana
        def aka(self):
                print("")
        print(self.val)
        tal = random.randint(0,100)
        if tal < 20:
            print("åkturen gick åt skogen, bättre lycka nästa gång")
        elif tal >= 20:
            print("jabbadabbbadoooooooo")
            return 1

#går i spökhuset
        def aka1(self):
                print("")
        print(self.val)
        tal = random.randint(0,100)
        if tal < 20:
            print("du är omringad av spöken och kan inte fortsätta")            return 0
        elif tal >= 20:
            print("Buhuuuuuu, buuuhuuuu")
            return 1

#programkod
print("Välkommen till nöjesfältet, vad vill du göra?")
print(" ")

while 1:
    vald_attr = input("Vad vill du göra?\n1. frittfall\n2. bergodalbana\n3. spökhuset\n4. Avsluta\n")
    if vald_attr == "1":
        val = Nojesfalt(attraktioner[0])
        if val.langdgrans() == 1:
            val.aka()
    elif vald_attr == "2":
        val = Nojesfalt(attraktioner[1])
        val.aka()
    elif vald_attr == "3":
        val = Nojesfalt(attraktioner[2])
        if val.aldersgrans() == 1:
            val.aka1()
    elif vald_attr == "4":
        break
Julia Lärkert
fuente
27
Ese es un problema con su editor de código, no realmente con Python. Debe cambiar su pregunta para reflejar eso y mencionar qué editor está utilizando.
Jeff Mercado
3
Cómo cambiar esto depende de su editor. No estoy seguro de que esto sea incluso sobre el tema aquí, podría ser una pregunta para el superusuario.
Lennart Regebro
Cambie su editor para mostrar espacios en blanco visibles al comienzo de la línea. Por ejemplo, he configurado mi editor para mostrar pestañas transparentes y espacios visibles porque uso pestañas para sangrar código. Si veo algún ruido al comienzo de la línea, sé que hay uno o más espacios adicionales. Si insiste en hacerlo de manera incorrecta, puede configurar su editor para ocultar espacios y mostrar pestañas. (Sí, sé sobre PEP-8 pero no estoy de acuerdo con eso.)
Mikko Rantalainen

Respuestas:

277

No uses pestañas.

  1. Configure su editor para usar 4 espacios para la sangría.
  2. Haga una búsqueda y reemplace para reemplazar todas las pestañas con 4 espacios.
  3. Asegúrese de que su editor esté configurado para mostrar pestañas como 8 espacios.

Nota: La razón de los 8 espacios para las pestañas es para que note de inmediato cuando las pestañas se han insertado involuntariamente, como al copiar y pegar desde un código de ejemplo que usa pestañas en lugar de espacios.

Lennart Regebro
fuente
77
¿Hay algún razonamiento detrás de estos dogmas?
RocketR
1
@Lennart Regebro, me refiero a usar espacios en absoluto. Los uso, pero inconscientemente, las pestañas me parecen mejores. Por cierto, en la programación de Ruby todos usan 2 espacios, por lo que no es una regla única para todos.
RocketR
3
@RocketR: La respuesta es para Python. Si usa solo pestañas, obtendrá una sangría de 8 espacios, a menos que expanda las pestañas a algo más que 8 espacios, en cuyo caso se verá mal en otros editores. Si mezcla pestañas y espacios, puede romperse (ver pregunta) o verse roto si tiene una expansión de pestañas que no sea de 8 espacios. En resumen: Usar pestañas para sangrar es increíblemente malo. Nunca haga eso nunca (excepto los idiomas / formatos de archivo que lo requieren). El fin.
Lennart Regebro
2
@RocketR Python tiene Pep8, un documento que enumera el "buen estilo de python" que establece explícitamente que 4 espacios es la forma aceptada en la sangría.
Daniel Gratzer
44
Enlace a la sección PEP 8 relevante en el spoiler "Tabs vs Spaces" : la primera línea es "Los espacios son el método de sangría preferido".
Tadhg McDonald-Jensen
63

Usando el autopep8siguiente comando lo arregló para mí:

 autopep8 -i my_file.py

Documentación para autopep8 vincular aquí.

Akavall
fuente
43

Con el editor IDLE puede usar esto:

  • Menú EditarSeleccionar todo
  • Formato de menú → Desagrupar región
  • Suponiendo que su editor haya reemplazado 8 espacios con una pestaña, ingrese 8 en el cuadro de entrada.
  • Presiona seleccionar, y arregla todo el documento.
arsb48
fuente
15

Si está utilizando Sublime Text para el desarrollo de Python, puede evitar el error utilizando el paquete Anaconda. Después de instalar Anaconda, abra su archivo en Sublime Text, haga clic derecho en los espacios abiertos → elija Anaconda → haga clic en autoformato. Hecho . O presione Ctrl+ Alt+ R.

Kapilfreeman
fuente
12

En general, las personas prefieren sangrar con espacio. Es más consistente en todos los editores, lo que resulta en menos desajustes de este tipo. Sin embargo, puede sangrar con tabulación. Es tu elección; Sin embargo, debe tener en cuenta que el estándar de 8 espacios por pestaña es un poco amplio.

Con respecto a su problema, lo más probable es que su editor lo haya estropeado. Convertir la pestaña al espacio depende realmente del editor.

En Emacs, por ejemplo, puede llamar al método 'untabify'.

En la línea de comando, puede usar una línea sed (adapte la cantidad de espacios a lo que le plazca):

   sed -e 's;\t;       ;' < yourFile.py > yourNedFile.py
Bruce
fuente
9

Al usar el editor de texto sublime, pude seleccionar el segmento de mi código que me estaba dando el inconsistent use of tabs and spaces in indentationerror y seleccionar:

view > indentation > convert indentation to spaces

lo que resolvió el problema para mí.

Dulangi_Kanchana
fuente
8

Lo que hice cuando apareció el mismo error: Seleccione todo ( Str+ A) y presione Shift+ Tab. Entonces ya nada estaba sangrado. Ahora regrese a las líneas que desea sangrar y vuelva a colocarlo como lo desee.

A mí me funcionó ...

hccavs19
fuente
7

Recientemente tuve el mismo problema y descubrí que solo necesitaba convertir el juego de caracteres del archivo .py a UTF-8, ya que ese es el conjunto que utiliza Python 3.

Por cierto, usé pestañas de 4 espacios todo el tiempo, por lo que el problema no fue causado por ellos.

Vlad
fuente
6

Sublime Text 3

En Sublime Text, MIENTRAS edita un archivo Python :

Menú Sublime Text > Preferencias > Configuración - Especificación de sintaxis :

Python.sublime-settings

{
    "tab_size": 4,
    "translate_tabs_to_spaces": true
}
chebaby
fuente
5

Es posible resolver este problema usando notepad++reemplazando Tabs por 4 Spaces:

  1. Elija Buscar -> Buscar ... o presione Ctrl+F
  2. Seleccione la pestaña Reemplazar
  3. En el cuadro llamado Modo de búsqueda, elija Extendido (\ n, \ r, \ t, \ 0, \ x ...)
  4. En el campo Buscar qué: escribir \ t
  5. En el campo Reemplazar con: presione Space4 veces. Asegúrese de que no haya nada más en este campo.
  6. Haga clic en el botón Reemplazar todo

Cómo reemplazar pestañas con espacios

Czarek
fuente
3

Tuve este problema Solución: su 'pestaña' antes de la línea del problema es espacios, 4, 6 u 8 espacios. Debe borrarlos e insertar TAB. '\ t'. Eso es todo.

Gaorin
fuente
No se recomienda usar caracteres TAB cuando se codifica con Python - lea PEP008 ( python.org/dev/peps/pep-0008 )
Tony Suffolk 66
2

Yo uso Notepad ++ y obtuve este error.

En Notepad ++, verá que tanto la pestaña como los cuatro espacios son iguales, pero cuando copie su código en Python IDLE , verá la diferencia y la línea con una pestaña tendrá más espacio antes que los demás.

Para resolver el problema, simplemente eliminé la pestaña antes de la línea y luego agregué cuatro espacios.

usuario3625605
fuente
2

Yo tenía el mismo error. Tuve que agregar varias líneas de código a un archivo * .py existente. En Notepad ++ no funcionó.

Después de agregar las líneas de código y guardar, obtuve el mismo error. Cuando abrí el mismo archivo en PyCharm y agregué las líneas, el error desapareció.

Andrushenko Alexander
fuente
1

Obtuve los mismos errores pero no pude entender qué estaba haciendo mal.

Así que lo arreglé ejecutando una sangría automática en mi código y permitiendo que la máquina corrija mi falla.

Si alguien se pregunta cómo hice eso. Sencillo. Entra en vim. Escriba G = gg.

Esto arreglará todo automáticamente. Buena suerte :)

Shaurya Kapoor
fuente
1

Su problema se debe a las limitaciones / configuración de su editor. Algunos editores le proporcionan herramientas para ayudar con el problema:

  1. Convertir pestañas en espacios

    Por ejemplo, si está utilizando el editor Python de Stani, puede configurarlo para que lo guarde.

  2. Convertir espacios en pestañas

Si está utilizando ActiveState Komodo, tiene una herramienta para 'tabular' su código. Como otros ya señalaron, esta no es una buena idea.

Pydev de Eclipse proporciona las funciones "Convertir pestañas en pestañas espaciales" y "Convertir pestañas espaciales en pestañas".

joaquin
fuente
1

Si su editor no reconoce las pestañas cuando realiza una búsqueda y reemplazo (como SciTE), puede pegar el código en Word y buscar usando Ctr-H y ^ t, que encuentra las pestañas que luego se pueden reemplazar con 4 espacios.

kozowh
fuente
1

Hubo un duplicado de esta pregunta desde aquí, pero pensé que ofrecería una visión que ver con los editores modernos y la amplia gama de características que ofrecen. Con el código de Python, todo lo que necesita ser intentado en un .pyarchivo, debe ser intentado usando la tecla de tabulación o por espacios. La convención es usar cuatro espacios para una sangría. La mayoría de los editores tienen la capacidad de mostrar visualmente en el editor si el código se sangra con espacios o pestañas, lo que es de gran ayuda para la depuración. Por ejemplo, con atom, yendo a preferencias y luego editor, puede ver las siguientes dos opciones:

editor de átomos para mostrar pestañas y espacios

Luego, si su código usa espacios, verá pequeños puntos donde su código está sangrado:

ingrese la descripción de la imagen aquí

Y si está sangrado usando pestañas, verá algo como esto:

ingrese la descripción de la imagen aquí

Ahora, si se dio cuenta, puede ver que al usar pestañas, hay más errores / advertencias a la izquierda, esto se debe a algo llamado documentación pep8 pep8 , que es básicamente una guía de estilo uniforme para python, de modo que todos los desarrolladores codifican principalmente El mismo estándar y apariencia, que ayuda cuando se trata de entender el código de otras personas, está en pep8 que favorece el uso de espacios para sangrar en lugar de pestañas. Y podemos ver que el editor muestra que hay una advertencia relacionada con el código de advertencia pep8 W191,

Espero que todo lo anterior le ayude a comprender la naturaleza del problema que tiene y cómo prevenirlo en el futuro.

jupiar
fuente
0

A veces, tabse ensucia al sangrar. Una forma es obviamente usar el tabybackspace para sangrar correctamente el código.

Otra forma es usar space 4 veces (dependiendo de cuánto desee sangrar).

Una forma extraña que funcionó para mí cuando nada más funcionó, cualquiera que sea la línea que obtengo el error, coloqué backspacedesa línea en la línea anterior y luego presioné enter. Automáticamente sangraba la línea a la posición correcta y no recibí ningún error después de eso.

Con suerte, esto debería ayudar.

Sarvagya Gupta
fuente
0

Tuve el mismo problema y lo solucioné usando el siguiente script de Python. Espero que ayude a otros.

se debe al uso de pestañas y espacios para sangrar código. en este script, reemplazo cada pestaña con cuatro espacios.

input_file = "source code path here"  # e.g. source.py
output_file = "out put file path here"  # e.g out.py
with open(input_file, 'r') as source:
    with open(output_file, 'a+') as result:
        for line in source:
            line = line.replace('\t', '    ')
            result.write(line)

si usa sublime o cualquier otro editor que le brinde la herramienta para reemplazar texto, puede reemplazar todas las pestañas por cuatro espacios desde el editor.

Farbod Shahinfar
fuente
0

Use, Idle para python o Idle3 para python3.

simc
fuente
2
Una pequeña explicación sobre cómo / por qué esto funcionó para usted hubiera sido útil.
Taslim Oseni
El problema se debe a pestañas en lugar de espacios en la región. Idle puede destabificar toda la región y soluciona el problema (simplemente elija Deshacer codificación en Formato de menú).
simc
0

Resolviendo esto usando el editor Vim

  1. Terminal abierto ( Ctrl+ Alt+ T).
  2. Vaya al directorio donde se encuentra el archivo ( cd <path_to_your_directory>). Ej: cd /home/vineeshvs/work.
  3. Abra el archivo en Vim ( vim <file_name>). Ej: vim myfile.txt.
  4. [Paso opcional] Habilite el resaltado de palabras clave de búsqueda en Vim ( ESC :set hlsearch)
  5. Vaya a la línea donde tiene este problema ( ESC :<line_number>). Ej: :53en el editor Vim después de presionar el ESCbotón una vez.
  6. Reemplace las pestañas usando el número requerido de espacios en Vim ( :.,$s/\t/<give_as_many_spaces_as_you_want_to_replace_tab>/gc). Ej: Tab se reemplazará con cuatro espacios con el siguiente comando: :.,$s/\t/ /gcdespués de presionar el ESC botón una vez). Este proceso es interactivo. Puede dar ypara reemplazar la pestaña con espacios y nomitir un reemplazo en particular. Presione ESCcuando haya terminado con los reemplazos necesarios.
vineeshvs
fuente
0

Curiosamente me encontré con un problema similar con uno de mis archivos .py. Simplemente abrí el archivo en Pycharm y presioné Option+ Command+ Lque formatea correctamente el contenido del archivo de una vez.

Sospecho que estaba teniendo problemas porque codifiqué este archivo .py en particular a través de Jupyter Labs en lugar de mi elección habitual de texto sublime o Pycharm y, por lo tanto, encontré algunos problemas de sangría ocultos a los que muchas respuestas aquí han aludido

DrDEE
fuente
0

Bueno, tuve el mismo problema y me di cuenta de que el problema es que copié el código de otro editor de Python para sublime.

Estaba trabajando con el cuaderno jupyter y luego copié el código en sublime. Aparentemente, cuando realiza modificaciones específicas (como mover código en funciones), la sangría se vuelve desordenada y de ahí proviene el problema.

Así que solo quédate con un editor. Si lo hace, no tendrá ningún problema.

Letsios Manthos
fuente
0

Úselo pylintle dará un informe detallado sobre cuántos espacios necesita y dónde.

Aymen Alsaadi
fuente
0

Si usa ATOM:

Vaya a Menú: Paquetes -> Espacio en blanco -> Convertir todas las pestañas en espacios

Daniel Moraite
fuente
0

Intenta eliminar las sangrías y luego presionar tabulador o presionar la barra espaciadora 4 veces. Esto generalmente me sucede cuando tengo una sangría usando la tecla de tabulación y luego uso la barra espaciadora en la siguiente línea.

Fateh
fuente
-2

Resalte los bits sangrados y luego haga clic en las pestañas. Luego se volverán consistentes :)

Anónimo
fuente
2
Esto entra en conflicto con PEP 8 , la guía de estilo canónico de Python, que recomienda 4 espacios. Aconsejar a las personas que usen pestañas es más inconsistente.
Aurora0001
sin mencionar que si los colaboradores de este código que usan PEP8 encontrarán el mismo error
Thomas Matthew