"Utilisation incohérente des tabulations et des espaces dans le retrait"

222

J'essaie de créer une application en Python 3.2 et j'utilise tout le temps des onglets pour l'indentation, mais même l'éditeur en change certains en espaces, puis j'imprime "une utilisation incohérente des onglets et des espaces en indentation" lorsque j'essaie d'exécuter le programme.

Comment puis-je changer les espaces en tabulations? Ça me rend fou. (Je suis débutant en programmation). Je serais heureux si je pouvais obtenir des conseils généraux sur mon code, si j'ai fait beaucoup d'erreurs, je serais heureux d'entendre.

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
la source
27
C'est un problème avec votre éditeur de code, pas vraiment avec python. Vous devez modifier votre question pour refléter cela et mentionner quel éditeur vous utilisez.
Jeff Mercado
3
La façon dont vous changez cela dépend de votre éditeur. Je ne suis pas sûr que ce soit même sur le sujet ici, ce pourrait être une question pour le superutilisateur.
Lennart Regebro
Modifiez votre éditeur pour afficher les espaces visibles au début de la ligne. Par exemple, j'ai configuré mon éditeur pour afficher des tabulations transparentes et des espaces visibles car j'utilise des tabulations pour indenter du code. Si je vois du bruit au début de la ligne, je sais qu'il y a un ou plusieurs espaces supplémentaires. Si vous insistez pour le faire de manière incorrecte, vous pouvez configurer votre éditeur pour masquer les espaces et afficher les onglets. (Ouais, je connais PEP-8 mais je ne suis pas d'accord avec ça.)
Mikko Rantalainen

Réponses:

277

N'utilisez pas d'onglets.

  1. Réglez votre éditeur pour utiliser 4 espaces pour l'indentation.
  2. Effectuez une recherche et remplacez pour remplacer tous les onglets par 4 espaces.
  3. Assurez-vous que votre éditeur est configuré pour afficher les onglets sur 8 espaces.

Remarque: La raison de 8 espaces pour les tabulations est de sorte que vous remarquiez immédiatement lorsque des tabulations ont été insérées involontairement - comme lors de la copie et du collage à partir d'un exemple de code utilisant des tabulations au lieu d'espaces.

Lennart Regebro
la source
7
Y a-t-il un raisonnement derrière ces dogmes?
RocketR
1
@Lennart Regebro, je veux dire utiliser des espaces. Je les utilise mais inconsciemment, les onglets me semblent meilleurs. Soit dit en passant, dans la programmation Ruby, tout le monde utilise 2 espaces, ce n'est donc pas une règle unique pour tous.
RocketR
3
@RocketR: La réponse est pour Python. Si vous n'utilisez que des tabulations, vous obtenez une indentation de 8 espaces, sauf si vous développez les tabulations à autre chose que 8 espaces, auquel cas cela ne sera pas bon sur les autres éditeurs. Si vous mélangez des tabulations et des espaces, il peut se casser (voir la question) ou avoir l'air cassé si vous avez une extension des tabulations autre que 8 espaces. En résumé: l'utilisation des onglets pour l'indentation est incroyablement mauvaise. Ne faites jamais ça (sauf pour les langues / formats de fichiers qui le nécessitent). La fin.
Lennart Regebro le
2
@RocketR Python a Pep8, un document qui répertorie le "bon style python" qui déclare explicitement que 4 espaces est la forme acceptée lors de l'indentation.
Daniel Gratzer
4
Lien vers la section pertinente du PEP 8 sur le spoiler "Tabs vs Spaces" : la première ligne est "Les espaces sont la méthode de retrait préférée."
Tadhg McDonald-Jensen
63

L'utilisation de la autopep8commande ci-dessous l'a corrigé pour moi:

 autopep8 -i my_file.py

Documentation pour autopep8 lié ici.

Akavall
la source
43

Avec l' éditeur IDLE , vous pouvez utiliser ceci:

  • Menu ÉditionSélectionner tout
  • Format du menu → Annuler la région
  • En supposant que votre éditeur a remplacé 8 espaces par une tabulation, entrez 8 dans la zone de saisie.
  • Appuyez sur sélectionner et il corrige le document entier.
arsb48
la source
15

Si vous utilisez Sublime Text pour le développement Python, vous pouvez éviter l'erreur en utilisant le package Anaconda. Après avoir installé Anaconda, ouvrez votre fichier dans Sublime Text, faites un clic droit sur les espaces ouverts → choisissez Anaconda → cliquez sur autoformat. C'est fait . Ou appuyez sur Ctrl+ Alt+ R.

Kapilfreeman
la source
12

Généralement, les gens préfèrent le retrait de l'espace. Il est plus cohérent entre les éditeurs, ce qui entraîne moins de disparités de ce type. Cependant, vous êtes autorisé à mettre en retrait avec tabulation. C'est ton choix; cependant, vous devez savoir que la norme de 8 espaces par tabulation est un peu large.

Concernant votre problème, votre éditeur a probablement foiré. La conversion de tabulation en espace dépend vraiment de l'éditeur.

Sur Emacs, par exemple, vous pouvez appeler la méthode 'untabify'.

En ligne de commande, vous pouvez utiliser une ligne sed (adaptez le nombre d'espaces à votre guise):

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

Lors de l'utilisation de l'éditeur de texte sublime, j'ai pu sélectionner le segment de mon code qui me donnait l' inconsistent use of tabs and spaces in indentationerreur et sélectionner:

view > indentation > convert indentation to spaces

ce qui a résolu le problème pour moi.

Dulangi_Kanchana
la source
8

Ce que j'ai fait lorsque la même erreur est apparue: sélectionnez tout ( Str+ A) et appuyez sur Shift+ Tab. Donc, rien n'était plus en retrait. Revenez maintenant aux lignes que vous souhaitez mettre en retrait et remettez-les comme vous le souhaitez.

Ça a marché pour moi ...

hccavs19
la source
7

J'ai récemment eu le même problème et j'ai découvert que j'avais juste besoin de convertir le jeu de caractères du fichier .py en UTF-8 car c'est l'ensemble utilisé par Python 3.

BTW, j'ai utilisé des onglets à 4 espaces tout le temps, donc le problème n'a pas été causé par eux.

Vlad
la source
6

Sublime Text 3

Dans Sublime Text, PENDANT l' édition d' un fichier Python :

Menu Texte sublime > Préférences > Paramètres - Spécifique à la syntaxe :

Paramètres Python.sublime

{
    "tab_size": 4,
    "translate_tabs_to_spaces": true
}
chebaby
la source
5

Il est possible de résoudre ce problème notepad++en remplaçant Tabs par 4 Spaces:

  1. Choisissez Rechercher -> Rechercher ... ou appuyez sur Ctrl+F
  2. Sélectionnez l' onglet Remplacer
  3. Dans la zone nommée Mode de recherche, choisissez Avancé (\ n, \ r, \ t, \ 0, \ x ...)
  4. Dans le champ Trouvez quoi: écrire \ t
  5. Dans le champ Remplacer par: appuyez Space4 fois. Assurez-vous qu'il n'y a rien d'autre dans ce domaine.
  6. Cliquez sur le bouton Remplacer tout

Comment remplacer des onglets par des espaces

Czarek
la source
3

J'ai eu ce problème. Solution: votre «tabulation» avant la ligne de problème est constituée d'espaces, 4, 6 ou 8 espaces. Vous devez les effacer et insérer TAB. '\ t'. C'est tout.

Gaorin
la source
Il n'est pas du tout recommandé d'utiliser des caractères TAB lors du codage avec Python - lire PEP008 ( python.org/dev/peps/pep-0008 )
Tony Suffolk 66
2

J'utilise Notepad ++ et j'ai obtenu cette erreur.

Dans Notepad ++, vous verrez que l'onglet et les quatre espaces sont identiques, mais lorsque vous copiez votre code dans Python IDLE, vous verrez la différence et la ligne avec un onglet aura plus d'espace devant elle que les autres.

Pour résoudre le problème, j'ai simplement supprimé l'onglet avant la ligne, puis ajouté quatre espaces.

user3625605
la source
2

J'ai eu la même erreur. J'ai dû ajouter plusieurs lignes de code à un fichier * .py existant. Dans Notepad ++, cela n'a pas fonctionné.

Après avoir ajouté les lignes de code et enregistré, j'ai eu la même erreur. Lorsque j'ai ouvert le même fichier dans PyCharm et ajouté les lignes, l'erreur a disparu.

Andrushenko Alexander
la source
1

J'ai eu les mêmes erreurs mais je n'ai pas pu comprendre ce que je faisais mal.

Je l'ai donc corrigé en exécutant l'indentation automatique sur mon code et en permettant à la machine de corriger ma faute.

Si quelqu'un se demande comment j'ai fait ça. Facile. Allez en vim. Tapez G = gg.

Cela corrigera automatiquement tout. Bonne chance :)

Shaurya Kapoor
la source
1

Votre problème est dû aux limitations / configuration de votre éditeur. Certains éditeurs vous fournissent des outils pour résoudre le problème en:

  1. Conversion d'onglets en espaces

    Par exemple, si vous utilisez l'éditeur Python de Stani, vous pouvez le configurer pour le faire lors de l'enregistrement.

  2. Conversion d'espaces en tabulations

Si vous utilisez ActiveState Komodo, vous disposez d'un outil pour «tabifier» votre code. Comme d'autres l'ont déjà souligné, ce n'est pas une bonne idée.

Pydev d'Eclipse fournit les fonctions "Convertir les tabulations en tabulations d'espace" et "Convertir les tabulations d'espace en tabulations".

joaquin
la source
1

Si votre éditeur ne reconnaît pas les onglets lors d'une recherche et d'un remplacement (comme SciTE), vous pouvez coller le code dans Word et effectuer une recherche à l'aide de Ctr-H et ^ t qui trouve les onglets qui peuvent ensuite être remplacés par 4 espaces.

kozowh
la source
1

Il y avait un double de cette question à partir d' ici, mais j'ai pensé offrir une vue à faire avec les éditeurs modernes et la vaste gamme de fonctionnalités qu'ils offrent. Avec le code python, tout ce qui doit être prévu dans un .pyfichier, doit être soit intentionnel à l'aide de la touche de tabulation, soit par des espaces. La convention consiste à utiliser quatre espaces pour une indentation. La plupart des éditeurs ont la possibilité de montrer visuellement sur l'éditeur si le code est en retrait avec des espaces ou des tabulations, ce qui facilite grandement le débogage. Par exemple, avec atom, en allant dans les préférences puis dans l'éditeur, vous pouvez voir les deux options suivantes:

éditeur d'atomes pour afficher les tabulations et les espaces

Ensuite, si votre code utilise des espaces, vous verrez de petits points où votre code est en retrait:

entrez la description de l'image ici

Et s'il est mis en retrait à l'aide d'onglets, vous verrez quelque chose comme ceci:

entrez la description de l'image ici

Maintenant, si vous l'avez remarqué, vous pouvez voir que lorsque vous utilisez des onglets, il y a plus d'erreurs / avertissements sur la gauche, c'est à cause de quelque chose appelé pep8 pep8 documentation , qui est fondamentalement un guide de style uniforme pour python, de sorte que tous les développeurs codent principalement pour le même standard et l'apparence, ce qui aide à comprendre le code des autres, c'est dans pep8 qui favorise l'utilisation d'espaces pour mettre en retrait plutôt que des tabulations. Et nous pouvons voir l'éditeur montrant qu'il y a un avertissement relatif au code d'avertissement pep8 W191,

J'espère que tout ce qui précède vous aide à comprendre la nature du problème que vous rencontrez et comment le prévenir à l'avenir.

jupiar
la source
0

Parfois, tabça gâche pendant le retrait. Une façon consiste évidemment à utiliser le tabet backspaceà indenter correctement le code.

Une autre façon consiste à utiliser space 4 fois (selon la quantité que vous souhaitez mettre en retrait).

Une façon étrange qui a fonctionné pour moi quand rien d'autre n'a fonctionné, quelle que soit la ligne où j'obtiens l'erreur, je backspacedcette ligne à la ligne précédente, puis j'ai appuyé enter. Il a automatiquement mis la ligne en retrait pour corriger la position et je n'ai plus eu d'erreur par la suite.

J'espère que cela devrait aider.

Sarvagya Gupta
la source
0

J'ai eu le même problème et le résoudre en utilisant le script python suivant. j'espère que cela aide les autres.

c'est à cause de l'utilisation des tabulations et des espaces pour indenter le code. dans ce script, je remplace chaque onglet par quatre espaces.

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 vous utilisez sublime ou tout autre éditeur qui vous donne l'outil pour remplacer le texte, vous pouvez remplacer tous les onglets par quatre espaces depuis l'éditeur.

Farbod Shahinfar
la source
0

Utilisez Idle pour python ou Idle3 pour python3.

simc
la source
2
Une petite explication sur comment / pourquoi cela a fonctionné pour vous aurait été utile.
Taslim Oseni
Le problème est dû aux tabulations au lieu des espaces dans la région. Inactif peut décompresser la région entière et résout le problème (choisissez simplement Décomposer du format de menu).
simc
0

Résoudre cela en utilisant l'éditeur Vim

  1. Terminal ouvert ( Ctrl+ Alt+ T).
  2. Accédez au répertoire où se trouve le fichier ( cd <path_to_your_directory>). Ex: cd /home/vineeshvs/work.
  3. Ouvrez le fichier dans Vim ( vim <file_name>). Ex: vim myfile.txt.
  4. [Étape facultative] Activer la mise en évidence des mots clés de recherche dans Vim ( ESC :set hlsearch)
  5. Allez à la ligne où vous avez ce problème ( ESC :<line_number>). Ex: :53dans l'éditeur Vim après avoir appuyé ESCune fois sur le bouton.
  6. Remplacez les tabulations en utilisant le nombre d'espaces requis dans Vim ( :.,$s/\t/<give_as_many_spaces_as_you_want_to_replace_tab>/gc). Ex: Tab sera remplacé par quatre espaces en utilisant la commande suivante: :.,$s/\t/ /gcaprès avoir appuyé ESC une fois sur le bouton). Ce processus est interactif. Vous pouvez donner ypour remplacer l'onglet par des espaces et npour sauter un remplacement particulier. Appuyez sur ESClorsque vous avez terminé avec les remplacements requis.
Vesheshvs
la source
0

J'ai étrangement rencontré un problème similaire avec l'un de mes fichiers .py. J'ai simplement ouvert le fichier dans Pycharm et appuyé sur Option+ Command+ Lqui formate correctement le contenu du fichier en une seule fois.

Je soupçonne que j'avais des problèmes parce que j'ai codé ce fichier .py particulier via les laboratoires jupyter par opposition à mon choix habituel de texte sublime ou Pycharm et j'ai donc rencontré des problèmes d'indentation cachés auxquels de nombreuses réponses ont fait allusion ici.

DrDEE
la source
0

Eh bien, j'ai eu le même problème et j'ai réalisé que le problème est que j'ai copié du code à partir d'un autre éditeur python pour le sublimer.

Je travaillais avec le cahier jupyter puis j'ai copié le code en sublime. Apparemment, lorsque vous apportez des modifications spécifiques (comme le déplacement de code dans des fonctions), l'indentation devient compliquée et c'est de là que vient le problème.

Il suffit donc de s'en tenir à un seul éditeur. Si vous le faites, vous n'aurez aucun problème.

Letsios Manthos
la source
0

L'utiliser pylintvous donnera un rapport détaillé sur le nombre d'espaces dont vous avez besoin et où.

Aymen Alsaadi
la source
0

Si vous utilisez ATOM:

Allez dans le menu: Packages -> WhiteSpace -> Convertir tous les onglets en espaces

Daniel Moraite
la source
0

Essayez de supprimer les retraits puis appuyez systématiquement sur tabulation ou sur espace 4 fois. Cela m'arrive généralement lorsque j'ai un retrait à l'aide de la touche de tabulation et que j'utilise ensuite la touche espace dans la ligne suivante.

Fateh
la source
-2

Sélectionnez les bits en retrait, puis cliquez sur les onglets. Ils deviendront alors cohérents :)

Anonyme
la source
2
Cela entre en conflit avec PEP 8 , le guide de style canonique Python, qui recommande 4 espaces. Conseiller aux gens d'utiliser des onglets est plus incohérent.
Aurora0001
sans oublier que si les collaborateurs de ce code qui utilisent PEP8 rencontreront la même erreur
Thomas Matthew