web-dev-qa-db-fra.com

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

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?

502
cbrulak

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)
572
Kevin Tighe

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.

228
activatedgeek

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 :-)

127
André

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.

36
zdan

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.

17
Dana

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

10
Gatica

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

8
Abgan

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.

7
cbartondock

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

4
Jackie Lee

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")
4
loretoparisi

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.

4
Matt Kahl

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

  1. Indentation non acceptée
  2. 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

2
JumpMan

pour Atom Utilisateurs, Packages ->whitspace -> remove trailing whitespaces cela a fonctionné pour moi

2
Aha

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.

1
Faisal Ahmed Farooq

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

1
Cedric

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!")
1
NelsonGon

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.

1
Cur123

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.

1
user3731311

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,

  1. ouvrez votre fichier en sublime
  2. clic droit sur les espaces ouverts
  3. choisir anaconda
  4. cliquer sur autoformat
  5. FAIT ou Appuyez sur CTRL + ALT + R.
0
Kapilfreeman

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

0
Imtiaz Pabel

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

pydev @ Eclipse

0
Rui Martins

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

0
plfrick

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 :

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

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.

0
Mike

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")
0
Ali

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

0
Rene Ferguson

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.

0
Eragon