IndentationError: unindent ne correspond à aucun niveau d'indentation externe

585

Lorsque je compile le code Python ci-dessous, j'obtiens

IndentationError: unindent ne correspond à aucun niveau d'indentation externe


import sys

def Factorial(n): # Return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

Pourquoi?

cbrulak
la source
7
et probablement la plage (1, n + 1) sera meilleure, si vous voulez inclure 'n' dans votre calcul :-)
Abgan
7
J'ai eu la même erreur, mais je me trouvais en retrait une méthode chemin dans le code légèrement vers la gauche, ce qui a donné cette erreur au bas de la prochaine méthode après. Cette erreur peut donc se produire non seulement en mélangeant des tabulations et des espaces.
contrat du professeur Falken a été rompu
14
J'utilise Sublime Text 3. J'ai un projet Django. J'ai corrigé l'erreur en utilisantView > Indentation > Intent Using Spaces
AbhimanyuAryan
Si ce problème était sur pycharm, l'ajustement des tabulations et de l'espacement dans les configurations ne fonctionnait pas. Le problème était que j'avais un fichier ~ / .editorconfig qui remplaçait la configuration pycharm.
Ken Myers
J'ai trouvé qu'en utilisant IDLE, il est beaucoup plus facile de trouver des problèmes d'indentation. Il trouvera clairement les erreurs d'indentation que la plupart des éditeurs ne trouveront pas.
Dennis Gathagu

Réponses:

670

D'autres affiches sont probablement correctes ... il peut y avoir des espaces mélangés avec vos onglets. Essayez de faire une recherche et de remplacer pour remplacer tous les onglets par quelques espaces.

Essaye ça:

import sys

def Factorial(n): # return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

print Factorial(10)
Kevin Tighe
la source
2
oui, je devais vraiment espacer la partie de la boucle intérieure au niveau des deux dernières lignes (en SO uniquement). Je ne sais pas pourquoi ...
cbrulak
3
ma première ligne, "result = 0" (qui aurait dû être 1, merci pour la correction) a été espacée tandis que le reste a été tabulé, sacrément, je ne savais pas que le python était comme ça
cbrulak
1
Ouais, ça peut être délicat. J'utilise emacs pour éditer python, et je l'ai configuré pour toujours remplacer les tabulations par des espaces dans les fichiers py, donc je n'ai pas ce problème. Notepad ++ pourrait également avoir une option comme celle-ci.
Kevin Tighe
3
Vous avez le même problème atm :). SublimeText montre les espaces sous forme de points, c'est assez utile.
Kris
Alors attendez, vous pouvez mettre en retrait avec des espaces OU des tabulations. vous avez juste besoin d'être cohérent? cogne la tête
David
265

IMPORTANT : Les espaces sont la méthode préférée - voir PEP008 Indentation et onglets ou espaces? . (Merci à @Siha pour cela.)

Pour les Sublime Textutilisateurs:

Réglez Sublime Textpour utiliser des onglets pour l'indentation: View-> Indentation->Convert Indentation to Tabs

Décochez également l' Indent Using Spacesoption dans le même sous-menu ci-dessus. Cela résoudra immédiatement ce problème.

activégeek
la source
1
Aussi, chaque fois que vous utilisez Python, assurez-vous de définir une option similaire dans l'éditeur IDE / texte que vous utilisez
enabledgeek
20
Toujours sur ATOM, Packages> Whitespace> Convert Spaces to Tabs et vous éviterez les maux de tête d'erreur de syntaxe Python!
loretoparisi
1
Les espaces sont la méthode préférée - voir PEP008 Indentation et onglets ou espaces? . Sublime peut également être configuré pour le faire de cette façon.
SiHa
13
vous dites que les espaces sont la méthode préférée mais votre réponse demande aux gens de demander à sublime d'utiliser des onglets à la place! Je suis confus
gota
@NunoCalaim Eh bien, malheureusement, cela s'est produit après avoir répondu à la question. Si vous démarrez un nouveau projet, veuillez utiliser la technique préférée des espaces. C'est pourquoi j'ai fait une modification en gras pour que tout nouveau venu soit au courant de la clause de non-responsabilité.
activatedgeek
137

Pour vérifier facilement les problèmes avec les tabulations / espaces, vous pouvez réellement faire ceci:

python -m tabnanny yourfile.py

ou vous pouvez simplement configurer correctement votre éditeur :-)

André
la source
1
J'ai essayé ceci dans un fichier avec une erreur d'indentation tab / espace, mais aucune sortie du tout avec un fichier tab incorrect. une idée?
Luchux
1
J'ai eu un problème avec les espaces et l'erreur a dit que c'était sur la ligne 191, mais grâce à tabnanny j'ai trouvé que le vrai problème n'était pas sur cette ligne, mais dans la ligne ci-dessus.
richar8086
Je vous remercie! Quel bon conseil. L'erreur a été identifiée par flake8 dans VS Code mais elle n'a pas pu identifier où était le problème - tabnanny l'a fait en une microseconde.
Steve
39

Êtes-vous sûr de ne pas mélanger les tabulations et les espaces dans votre espace blanc d'indentation? (Cela provoquera cette erreur.)

Remarque, il est recommandé de ne pas utiliser d'onglets dans le code Python. Voir le guide de style . Vous devez configurer Notepad ++ pour insérer des espaces pour les tabulations.

zdan
la source
Je suis confus. La réponse ci-dessus indique de changer une option d'éditeur de texte pour utiliser des tabulations au lieu d'espaces.
spurra
3
@BananaCode Tant que vous utilisez UNIQUEMENT des tabulations ou des espaces UNIQUEMENT, peu importe techniquement ce que vous choisissez. Bien que pour python, les espaces soient préférés, voir le lien auquel j'ai fait référence.
zdan
21

Chaque fois que j'ai rencontré cette erreur, c'est parce que j'ai en quelque sorte mélangé les tabulations et les espaces dans mon éditeur.

Dana
la source
13

Si vous utilisez l'éditeur IDLE de Python, vous pouvez faire ce qu'il suggère dans l'un des messages d'erreur similaires:

1) sélectionnez tout, par exemple Ctrl+A

2) Allez dans Format -> Untabify Region

3) Vérifiez que votre retrait est toujours correct, enregistrez et réexécutez votre programme.

J'utilise Python 2.5.4

Gatica
la source
9

Si vous utilisez Vim, appuyez sur Échap, puis tapez

gg = G

Cette auto met tout en retrait et effacera tous les espaces dans lesquels vous avez jeté.

cbartondock
la source
8

La ligne: result = result * idoit être en retrait (c'est le corps de la boucle for).

Ou - vous avez des espaces et des tabulations mixtes

Abgan
la source
J'ai dû changer le montage en SO, étrange. Voir ma note "Modifier" mise à jour dans la question
cbrulak
Ok, donc je crois que la deuxième ligne de ma réponse est correcte - vous avez des espaces et des tabulations mixtes (32 et 8 en ASCII, respectivement)
Abgan
5

Sur Atom

aller à

Packages > Whitespace > Convert Spaces to Tabs

Vérifiez ensuite à nouveau l'indentation de votre fichier:

python -m tabnanny yourFile.py

ou

>python
>>> help("yourFile.py")
loretoparisi
la source
4

Semble être un problème d'indentation. Vous ne devez pas correspondre accolades en Python , mais vous ne devez faire correspondre les niveaux d'indentation.

La meilleure façon d'éviter les problèmes d'espace / tabulation est d'afficher des caractères invisibles dans votre éditeur de texte. Cela vous donnera un moyen rapide de prévenir et / ou de résoudre les erreurs liées à l'indentation.

De plus, l'injection de code copié-collé est une source courante pour ce type de problème.

Matt Kahl
la source
4

Si vous utilisez notepad ++, effectuez un "remplacement" avec le mode de recherche étendue pour trouver \ t et remplacez par quatre espaces.

Jackie Lee
la source
2

pour les utilisateurs d'Atom, Packages ->whitspace -> remove trailing whitespaces cela a fonctionné pour moi

Aha
la source
2

Juste un ajout. J'ai eu un problème similaire avec les deux indentations dans Notepad ++.

  1. Indentation non acceptée
  2. Niveau d'indentation externe

    Allez dans ----> onglet Rechercher ----> appuyez sur remplacer ----> appuyez sur le bouton radio Étendu ci-dessous ---> Remplacez maintenant \ t par quatre espaces

    Allez dans ----> onglet Rechercher ----> appuyez sur remplacer ----> appuyez sur le bouton radio Étendu ci-dessous ---> Remplacez maintenant \ n par rien

JumpMan
la source
2

J'utilisais le bloc-notes Jupyter et j'ai essayé presque toutes les solutions ci-dessus (en m'adaptant à mon scénario) en vain. Je suis ensuite allé ligne par ligne, supprimé tous les espaces pour chaque ligne et remplacé par tab. Cela a résolu le problème.

Cur123
la source
2

Pour les utilisateurs de Spyder, accédez à Source> Fix Indentation pour résoudre le problème immédiatement

Hafiz Abdulbasith
la source
1

Cela pourrait être dû au fait que la fonction au-dessus n'est pas en retrait de la même manière. c'est à dire

class a:
    def blah:
      print("Hello world")
    def blah1:
      print("Hello world")
Ali
la source
1

J'ai eu le même problème hier, c'était une erreur d'indentation, j'utilisais un éditeur de texte sublime. a pris mes heures à essayer de le réparer et à la fin j'ai fini par copier le code dans l'éditeur de texte VI et cela a bien fonctionné. ps python est trop sensible aux espaces, assurez-vous de ne pas mélanger espace et tabulation.

user3731311
la source
1

Comme je me rends compte qu'il n'y a pas de réponse spécifique à spyder, j'en ajouterai une: Fondamentalement, regardez attentivement votre ifdéclaration et assurez-vous que tout if, elifet elseayez le même espacement, c'est-à-dire qu'ils sont sur la même ligne au début, comme suit:

def your_choice(answer):
    if answer>5:
        print("You're overaged")
    elif answer<=5 and answer>1: 
            print("Welcome to the toddler's club!")
    else:
            print("No worries mate!")
NelsonGon
la source
1

J'avais une fonction définie, mais elle n'avait pas de contenu en dehors de ses commentaires de fonction ...

def foo(bar):
    # Some awesome temporary comment.
    # But there is actually nothing in the function!
    # D'Oh!

Il a crié:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

(notez que la ligne vers laquelle la ^marque pointe est vide)

-

Solutions multiples:

1: Il suffit de commenter la fonction

2: Ajouter un commentaire de fonction

def foo(bar):
    '' Some awesome comment. This comment could be just one space.''

3: ajouter une ligne qui ne fait rien

def foo(bar):
    0

Dans tous les cas, assurez-vous de faire comprendre pourquoi il s'agit d'une fonction vide - pour vous-même ou pour vos pairs qui utiliseront votre code

Cédric
la source
La déclaration de laissez-passer pourrait y être utile :)
KevinG
1

Tout d'abord, juste pour vous rappeler qu'il y a une erreur logique, vous feriez mieux de garder result = 1 ou bien votre sortie sera result = 0 même après l'exécution de la boucle.

Deuxièmement, vous pouvez l'écrire comme ceci:

import sys

def Factorial(n): # Return factorial
  result = 0
  for i in range (1,n):
     result = result * i

  print "factorial is ",result
  return result

Laisser une ligne indiquera au shell python que les instructions FOR sont terminées. Si vous avez de l'expérience avec le shell python, vous pouvez comprendre pourquoi nous devons laisser une ligne.

Faisal Ahmed Farooq
la source
1

Pour ce que ça vaut, ma docstring était trop en retrait et cela génère également la même erreur

class junk: 
     """docstring is indented too much""" 
    def fun(): return   

IndentationError: unindent does not match any outer indentation level

plfrick
la source
cela a résolu mon problème
bhordupur
0

En effet, il y a un mélange d'onglets et d'espaces. Vous pouvez soit supprimer tous les espaces et les remplacer par des tabulations.

Ou, essayez d'écrire ceci:

#!/usr/bin/python -tt

au début du code. Cette ligne résout toutes les différences entre les tabulations et les espaces.

Eragon
la source
0

dans mon cas, le problème était la configuration de pydev sur Eclipse

pydev @ Eclipse

Rui Martins
la source
0

Si vous utilisez l'éditeur Komodo, vous pouvez faire ce qu'il suggère dans l'un des messages d'erreur similaires:

1) sélectionnez tout, par exemple Ctrl + A

2) Allez dans Code -> Untabify Region

3) Vérifiez que votre retrait est toujours correct, enregistrez et réexécutez votre programme.

J'utilise Python 3.4.2

Imtiaz Pabel
la source
0

Si vous utilisez du texte Sublime pour le développement de python, vous pouvez éviter l'erreur en utilisant le package Anaconda. Après avoir installé Anaconda,

  1. ouvrez votre dossier en sublime
  2. clic droit sur les espaces ouverts
  3. choisissez anaconda
  4. cliquez sur autoformat
  5. Terminé ou appuyez sur CTRL + ALT + R.
Kapilfreeman
la source
0

Dans intellij avec le plugin python, Ctrl + Shift + Alt pour reformater le document a corrigé le problème de retrait / tabulation / espaces

René Ferguson
la source
0

Pour les utilisateurs de SPYDER : J'utilise spyder 3.3.2 avec python 3.7.1 et j'ai résolu cela, définissant l'indentation pour utiliser des onglets, avec les étapes suivantes, cliquez sur:

  • Outils.
  • Préférences.
  • Éditeur.
  • Réglages avancés.
  • Caractères d'indentation -> Tabulations.

Ensuite, je réinitialise la ligne "non identifié" à l'aide de la touche de tabulation.

Pour une raison quelconque, sans ce paramètre, j'ai parfois le fantôme IndentationError.

Mike
la source
0

Par exemple:

1. def convert_distance(miles):
2.   km = miles * 1.6
3.   return km

Dans ce code, la même situation s'est produite pour moi. Supprimez simplement les espaces de retrait précédents des lignes 2 et 3, puis utilisez la tabulation ou l'espace. N'utilisez jamais les deux . Donnez une indentation appropriée lors de l'écriture de code en python. Pour Spyder goto Source> Fix Indentation. Il en va de même pour le code VC et le texte sublime ou tout autre éditeur. Corrigez l'indentation.

Ayush Aryan
la source
-6

Cela se produit principalement à cause de l'éditeur .Essayez de changer les onglets en espaces (4) .Les meilleurs IDE ou éditeurs compatibles python sont pycharm, sublime, vim pour linux.
Même moi aussi, j'avais rencontré le même problème, plus tard, j'ai trouvé qu'il y avait un problème d'encodage. Je vous suggère de changer trop d'éditeur.

yunus
la source