“Uso inconsistente de tabulações e espaços no recuo”

218

Estou tentando criar um aplicativo no Python 3.2 e uso abas o tempo todo para indentação, mas mesmo o editor altera algumas delas em espaços e depois imprime "uso inconsistente de abas e espaços na indentação" quando tento executar o programa.

Como posso alterar os espaços em guias? Está me deixando louco. (Eu sou iniciante em programação). Ficaria feliz em poder obter algumas dicas gerais sobre o meu código, se eu cometer muitos erros, ficaria feliz em ouvir.

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
fonte
25
Esse é um problema com o seu editor de código, não com o python. Você deve alterar sua pergunta para refletir isso e mencionar qual editor você está usando.
Jeff Mercado
3
Como você muda isso depende do seu editor. Não tenho certeza se esse tópico é sobre o assunto aqui, pode ser uma pergunta para o superusuário.
Lennart Regebro
Altere seu editor para mostrar espaços em branco visíveis no início da linha. Por exemplo, configurei meu editor para mostrar guias transparentes e espaços visíveis porque uso guias para recuar o código. Se houver algum ruído no início da linha, sei que há um ou mais espaços extras. Se você insistir em fazê-lo da maneira incorreta, poderá configurar seu editor para ocultar espaços e mostrar guias. (Sim, eu sei sobre o PEP-8, mas eu não concordo com isso.)
Mikko Rantalainen

Respostas:

273

Não use guias.

  1. Defina seu editor para usar 4 espaços para indentação.
  2. Faça uma pesquisa e substitua para substituir todas as guias por 4 espaços.
  3. Verifique se o seu editor está definido para exibir guias como 8 espaços.

Nota: O motivo de 8 espaços para guias é para que você observe imediatamente quando as guias foram inseridas acidentalmente - como ao copiar e colar do código de exemplo que usa guias em vez de espaços.

Lennart Regebro
fonte
7
Existe algum raciocínio por trás desses dogmas?
RocketR
1
@Lennart Regebro, quero dizer usando espaços. Eu os uso, mas inconscientemente, as guias parecem melhores para mim. A propósito, na programação Ruby, todo mundo usa 2 espaços, portanto, não é uma regra única para todos.
RocketR
3
@RocketR: A resposta é para Python. Se você usar apenas guias, você obtém um recuo de 8 espaços, a menos que você expanda as guias para algo além de 8 espaços, caso em que ficará ruim em outros editores. Se você misturar guias e espaços, ele poderá se romper (consulte a pergunta) ou parecer quebrado se você tiver uma expansão de guias que não seja de 8 espaços. Em resumo: o uso de guias para recuo é incrivelmente ruim. Nunca faça isso nunca (exceto para idiomas / formatos de arquivo que exijam isso). O fim.
Lennart Regebro
2
O @RocketR Python possui o Pep8, um documento que lista o "bom estilo python", que afirma explicitamente que 4 espaços é a forma aceita no recuo.
Daniel Gratzer
4
Link para a seção relevante do PEP 8 no spoiler "Guias x Espaços" : a primeira linha é "Os espaços são o método de indentação preferido".
Tadhg McDonald-Jensen
62

Usando o autopep8comando abaixo corrigi-lo para mim:

 autopep8 -i my_file.py

Documentação para autopep8 link aqui.

Akavall
fonte
43

Com o editor IDLE , você pode usar isto:

  • Menu EditarSelecionar Tudo
  • Formato de menu → Untabify Region
  • Supondo que seu editor substituiu 8 espaços por uma guia, digite 8 na caixa de entrada.
  • Pressione select e ele corrige o documento inteiro.
arsb48
fonte
15

Se você estiver usando o Sublime Text para desenvolvimento em Python, poderá evitar o erro usando o pacote Anaconda. Após instalar o Anaconda, abra seu arquivo em Sublime Text, clique com o botão direito do mouse nos espaços abertos → escolha Anaconda → clique em formatação automática. Feito . Ou pressione Ctrl+ Alt+ R.

Kapilfreeman
fonte
12

Geralmente, as pessoas preferem recuar com espaço. É mais consistente entre os editores, resultando em menos incompatibilidades desse tipo. No entanto, você pode recuar com a guia. É a sua escolha; no entanto, você deve estar ciente de que o padrão de 8 espaços por guia é um pouco amplo.

Em relação ao seu problema, provavelmente, seu editor errou. Converter tab em espaço é realmente dependente do editor.

No Emacs, por exemplo, você pode chamar o método 'untabify'.

Na linha de comando, você pode usar uma linha sed (adapte o número de espaços ao que quiser):

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

Ao usar o editor de texto sublime, pude selecionar o segmento do meu código que estava me dando o inconsistent use of tabs and spaces in indentationerro e selecionar:

view > indentation > convert indentation to spaces

o que resolveu o problema para mim.

Dulangi_Kanchana
fonte
8

O que fiz quando o mesmo erro apareceu: Selecione tudo ( Str+ A) e pressione Shift+ Tab. Então, nada foi mais recuado. Agora volte para as linhas que deseja recuar e recoloque como deseja.

Funcionou para mim ...

hccavs19
fonte
7

Recentemente, tive o mesmo problema e descobri que só precisava converter o conjunto de caracteres do arquivo .py para UTF-8, pois esse é o conjunto que o Python 3 usa.

BTW, eu usei abas de 4 espaços o tempo todo, então o problema não foi causado por elas.

Vlad
fonte
6

Texto sublime 3

Em Sublime Texto, ENQUANTO editar um Python arquivo:

Menu Texto sublime > Preferências > Configurações - Específico de sintaxe :

Python.sublime-settings

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

É possível resolver esse problema usando notepad++substituindo Tabs por 4 Spaces:

  1. Escolha Pesquisar -> Localizar ... ou pressione Ctrl+F
  2. Selecione a guia Substituir
  3. Na caixa denominada Modo de pesquisa, escolha Estendido (\ n, \ r, \ t, \ 0, \ x ...)
  4. No campo Localizar: escreva \ t
  5. No campo Substituir por: pressione Space4 vezes. Certifique-se de que não há mais nada nesse campo.
  6. Clique no botão Substituir tudo

Como substituir guias por espaços

Czarek
fonte
3

Eu tive esse problema. Solução: sua 'guia' antes da linha do problema é espaços, 4, 6 ou 8 espaços. Você deve apagá-los e inserir TAB. '\ t'. Isso é tudo.

Gaorin
fonte
Não é recomendado o uso de caracteres TAB ao codificar com Python - leia PEP008 ( python.org/dev/peps/pep-0008 )
Tony Suffolk 66
2

Eu uso o Notepad ++ e recebi esse erro.

No Notepad ++, você verá que a guia e os quatro espaços são iguais, mas quando você copia seu código no Python IDLE, você vê a diferença e a linha com uma guia tem mais espaço do que as outras.

Para resolver o problema, acabei de excluir a guia antes da linha e adicionar quatro espaços.

user3625605
fonte
2

Eu tive o mesmo erro. Eu tive que adicionar várias linhas de código a um arquivo * .py existente. No Notepad ++, não funcionou.

Depois de adicionar as linhas de código e salvar, recebi o mesmo erro. Quando abri o mesmo arquivo no PyCharm e adicionei as linhas, o erro desapareceu.

Andrushenko Alexander
fonte
1

Eu recebi os mesmos erros, mas não conseguia descobrir o que estava fazendo de errado.

Portanto, eu o corrigi executando o recuo automático no meu código e permitindo que a máquina corrija minha falha.

Se alguém está se perguntando como eu fiz isso. Simples. Vá em vim. Digite G = gg.

Isso corrigirá tudo automaticamente. Boa sorte :)

Shaurya Kapoor
fonte
1

Seu problema é devido às limitações / configuração do seu editor. Alguns editores fornecem ferramentas para ajudar no problema:

  1. Convertendo guias em espaços

    Por exemplo, se você estiver usando o editor Python do Stani, poderá configurá-lo para salvá-lo.

  2. Convertendo espaços em guias

Se você estiver usando o ActiveState Komodo, terá uma ferramenta para 'tabificar' seu código. Como outros já apontaram, essa não é uma boa ideia.

O Pydev do Eclipse fornece as funções "Converter abas em abas espaciais" e "Converter abas espaciais em abas".

joaquin
fonte
1

Se o seu editor não reconhecer guias ao fazer uma pesquisa e substituição (como SciTE), você poderá colar o código no Word e pesquisar usando Ctr-H e ^ t, que encontra as guias que podem ser substituídas por 4 espaços.

kozowh
fonte
1

Havia uma duplicata dessa pergunta daqui, mas pensei em oferecer uma visão dos editores modernos e da vasta gama de recursos que eles oferecem. Com o código python, qualquer coisa que precise ser intencionada em um .pyarquivo precisa ser intentada usando a tecla tab ou por espaços. Convenção é usar quatro espaços para um recuo. A maioria dos editores tem a capacidade de mostrar visualmente no editor se o código está sendo recuado com espaços ou guias, o que ajuda muito na depuração. Por exemplo, com atom, indo para preferências e, em seguida, editor, você pode ver as duas opções a seguir:

editor atom para mostrar guias e espaços

Então, se seu código estiver usando espaços, você verá pequenos pontos onde seu código é recuado:

insira a descrição da imagem aqui

E se for recuado usando guias, você verá algo assim:

insira a descrição da imagem aqui

Agora, se você notou, pode ver que, ao usar guias, há mais erros / avisos à esquerda, devido a algo chamado documentação pep8 pep8 , que é basicamente um guia de estilo uniforme para python, para que todos os desenvolvedores codifiquem principalmente o mesmo padrão e aparência, que ajuda ao tentar entender o código de outras pessoas, é no pep8 que favorece o uso de espaços para recuar em vez de tabulações. E podemos ver o editor mostrando que existe um aviso relacionado ao código de aviso pep8 W191,

Espero que todas as opções acima ajudem você a entender a natureza do problema que está tendo e como evitá-lo no futuro.

jupiar
fonte
0

Às vezes, taberra enquanto recua. Uma maneira é obviamente usar o tabe backspacerecuar corretamente o código.

Outra maneira é usar space 4 vezes (dependendo de quanto você deseja recuar).

Uma maneira estranha que funcionou para mim quando nada mais funcionou, qualquer que seja a linha que eu recebi o erro, coloquei backspacedessa linha na linha anterior e pressionei enter. Recuou automaticamente a linha para corrigir a posição e não obtive nenhum erro depois disso.

Felizmente, isso deve ajudar.

Sarvagya Gupta
fonte
0

Eu tive o mesmo problema e corrigi-lo usando o seguinte script python. espero que ajude os outros.

é por usar guias e espaços para recuar o código. neste script, substituo cada guia por quatro espaços.

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)

se você usar o sublime ou qualquer outro editor que ofereça a ferramenta para substituir o texto, você poderá substituir todas as guias por quatro espaços do editor.

Farbod Shahinfar
fonte
0

Use, Idle para python ou Idle3 para python3.

simc
fonte
2
Uma pequena elaboração de como / por que isso funcionou para você teria sido útil.
Taslim Oseni 25/03/19
O problema é por causa de guias em vez de espaços na região. O modo inativo pode desabilitar toda a região e solucionar o problema (basta escolher Desabilitar no formato de menu).
simc 25/03/19
0

Resolvendo isso usando o editor Vim

  1. Abra o terminal ( Ctrl+ Alt+ T).
  2. Vá para o diretório em que o arquivo está localizado ( cd <path_to_your_directory>). Ex: cd /home/vineeshvs/work.
  3. Abra o arquivo no Vim ( vim <file_name>). Ex: vim myfile.txt.
  4. [Etapa opcional] Ative o realce da palavra-chave de pesquisa no Vim ( ESC :set hlsearch)
  5. Vá para a linha onde você tem esse problema ( ESC :<line_number>). Ex: :53no editor Vim depois de pressionar o ESCbotão uma vez.
  6. Substitua as guias usando o número necessário de espaços no Vim ( :.,$s/\t/<give_as_many_spaces_as_you_want_to_replace_tab>/gc). Ex: Tab será substituído por quatro espaços usando o seguinte comando: :.,$s/\t/ /gcdepois de pressionar o ESC botão uma vez). Este processo é interativo. Você pode ysubstituir a aba por espaços e npular uma substituição específica. Pressione ESCquando terminar as substituições necessárias.
vineeshvs
fonte
0

Estranhamente, tive um problema semelhante com um dos meus arquivos .py. Simplesmente abri o arquivo no Pycharm e pressionei Option+ Command+, Lque formata corretamente o conteúdo do arquivo de uma só vez.

Eu suspeito que estava tendo problemas porque codifiquei esse arquivo .py em particular nos laboratórios Jupyter, em oposição à minha escolha usual de texto sublime ou Pycharm e, portanto, encontrei alguns problemas ocultos de recuo que muitas respostas aqui mencionaram

DrDEE
fonte
0

Bem, eu tive o mesmo problema e percebi que o problema é que copiei o código de outro editor de python para sublime.

Eu estava trabalhando com o notebook jupyter e depois copiei o código em sublime. Aparentemente, quando você faz modificações específicas (como mover código nas funções), o recuo fica confuso e é daí que o problema surge.

Então, fique com um editor. Se você fizer isso, não terá nenhum problema.

Letsios Manthos
fonte
0

Use pylint-o para fornecer um relatório detalhado sobre quantos espaços você precisa e onde.

Aymen Alsaadi
fonte
0

Se você usa o ATOM:

Vá para Menu: Pacotes -> WhiteSpace -> Converter todas as guias em espaços

Daniel Moraite
fonte
0

Tente excluir os recuos e, sistematicamente, pressione a tecla Tab ou pressione o espaço 4 vezes. Isso geralmente acontece comigo quando tenho um recuo usando a tecla tab e depois a tecla espaço na próxima linha.

Fateh
fonte
-2

Marque os bits recuados e clique nas guias. Eles se tornarão consistentes :)

Anônimo
fonte
2
Isso entra em conflito com o PEP 8 , o guia de estilo canônico do Python, que recomenda 4 espaços. Aconselhar as pessoas a usar guias é mais inconsistente.
precisa
para não mencionar que se colaboradores sobre este código que estão usando PEP8 vai encontrar o mesmo erro
Thomas Matthew