Quand je compile le code Python ci-dessous, je reçois
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?
D'autres affiches sont probablement correctes ... il pourrait y avoir des espaces mélangés avec vos onglets. Essayez de faire une recherche et remplacer pour remplacer tous les onglets avec 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)
IMPORTANT: Les espaces sont la méthode préférée - voir PEP008 Indentation et Onglets ou espaces? . (Merci à @Siha pour cela.)
Pour les utilisateurs de Sublime Text
:
Définissez Sublime Text
pour utiliser des tabulations pour l'indentation: View
-> Indentation
-> Convert Indentation to Tabs
Décochez l'option Indent Using Spaces
dans le même sous-menu ci-dessus. Cela résoudra immédiatement ce problème.
Pour vérifier facilement les problèmes liés aux onglets/espaces, procédez comme suit:
python -m tabnanny yourfile.py
ou vous pouvez juste configurer votre éditeur correctement, bien sûr :-)
Etes-vous sûr de ne pas mélanger les onglets et les espaces dans votre espace blanc d'indentation? (Cela provoquera cette erreur.)
Notez qu'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 onglets.
Chaque fois que j'ai rencontré cette erreur, c'est parce que j'ai en quelque sorte mélangé des onglets et des espaces dans mon éditeur.
Si vous utilisez l'éditeur IDLE de Python, vous pouvez procéder comme indiqué dans l'un des messages d'erreur similaires:
1) tout sélectionner, par exemple Ctrl + A
2) Allez à Format -> Untabify Region
3) Vérifiez que votre mise en retrait est toujours correcte, enregistrez et réexécutez votre programme.
J'utilise Python 2.5.4
La ligne: result = result * i
devrait être en retrait (c'est le corps de la boucle for).
Ou - vous avez un espace mixte et des caractères de tabulation
Si vous utilisez Vim, appuyez sur echap et tapez
gg = G
Cette mise en retrait automatique de tout et va effacer tous les espaces que vous avez jeté po.
Si vous utilisez notepad ++, effectuez un "remplacement" avec le mode de recherche étendue pour rechercher\t et remplacez-le par quatre espaces.
Sur Atom
aller à
Packages > Whitespace > Convert Spaces to Tabs
Ensuite, vérifiez à nouveau l'indentation de votre fichier:
python -m tabnanny yourFile.py
ou
>python
>>> help("yourFile.py")
Semble être un problème d’indentation. Vous n'avez pas besoin de faire correspondre les accolades dans Python mais vous faites devez faire correspondre les niveaux d'indentation.
Le meilleur moyen d'éviter les problèmes d'espace/tabulation consiste à afficher des caractères invisibles dans votre éditeur de texte. Cela vous donnera un moyen rapide d'empêcher et/ou de résoudre les erreurs liées à l'indentation.
En outre, l’injection de code copié-collé est une source courante de ce type de problème.
Juste un ajout. J'ai eu un problème similaire avec les deux empreintes dans Notepad ++.
Niveau d'indentation externe
Allez à ----> onglet Recherche ----> tapez sur remplacer ----> appuyez sur le bouton radio Avancé ci-dessous ---> Maintenant, remplacez\t avec quatre espaces
Allez à ----> onglet Recherche ----> tapez sur remplacer ----> appuyez sur le bouton radio Avancé ci-dessous ---> Maintenant, remplacez\n avec rien
pour Atom Utilisateurs, Packages ->whitspace -> remove trailing whitespaces
cela a fonctionné pour moi
Tout d'abord, pour vous rappeler qu'il y a une erreur logique, il vaut mieux conserver result = 1, sinon votre résultat 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
Si vous quittez une ligne, le shell python _ sera informé de la fin des instructions FOR. Si vous avez déjà utilisé le shell python, vous comprendrez pourquoi nous devons laisser une ligne.
J'avais une fonction définie, mais elle n'avait aucun 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 pointée par la marque ^
est vide)
-
Plusieurs solutions:
1: Commentez 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 le rendre évident pourquoi c'est une fonction vide - pour vous-même ou pour vos pairs qui utilisera votre code
Comme je me rends compte qu'il n'y a pas de réponse spécifique à spyder
, je vais en ajouter une: en gros, examinez attentivement votre déclaration if
et assurez-vous que tous if
, Elif
et else
ont 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!")
J'utilisais l'ordinateur portable Jupyter et j'essayais presque toutes les solutions ci-dessus (adaptation à mon scénario). Je suis ensuite allé ligne par ligne, supprimé tous les espaces pour chaque ligne et remplacé par tabulation. Cela a résolu le problème.
J'ai eu le même problème hier, c'était une erreur d'indentation, j'utilisais un éditeur de texte sublime. Cela a pris des heures à essayer de résoudre ce problème et à la fin, j'ai fini par copier le code dans l'éditeur de texte VI et tout fonctionnait correctement. ps python est trop sensible aux espaces, assurez-vous de ne pas mélanger espace et tabulation.
Si vous utilisez du texte Sublime pour le développement python, vous pouvez éviter l'erreur en utilisant le package Anaconda.Après l'installation de Anaconda,
- ouvrez votre fichier en sublime
- clic droit sur les espaces ouverts
- choisir anaconda
- cliquer sur autoformat
- FAIT ou Appuyez sur CTRL + ALT + R.
Si vous utilisez l'éditeur Komodo, vous pouvez procéder comme indiqué dans l'un des messages d'erreur similaires:
1) tout sélectionner, par exemple Ctrl + A
2) Aller au code -> Untabify Region
3) Vérifiez que votre mise en retrait est toujours correcte, enregistrez et réexécutez votre programme.
J'utilise Python 3.4.2
dans mon cas, le problème était la configuration de pydev sur Eclipse
Pour ce que ça vaut, ma docstring était trop indentée et cela jette aussi la même erreur
class junk:
"""docstring is indented too much"""
def fun(): return
IndentationError: unindent does not match any outer indentation level
Pour les utilisateurs de SPYDER: J'utilise spyder 3.3.2 avec python 3.7.1 et j'ai résolu ce problème en définissant l'indentation pour utiliser des onglets. Pour ce faire, cliquez sur :
Ensuite, je réinitialise la ligne "non identifiée" à l'aide de la touche de tabulation.
Pour une raison quelconque, sans ce paramètre, j'ai parfois le fantôme IndentationError.
C'est peut-être parce que la fonction ci-dessus n'est pas indentée de la même manière. c'est à dire.
class a:
def blah:
print("Hello world")
def blah1:
print("Hello world")
Dans intellij avec le plugin python, Ctrl + Maj + Alt pour reformater le document a résolu le problème de retrait/tabulation/espaces
En effet, il existe une confusion entre les onglets et les 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 les différences entre les tabulations et les espaces.