66 votes

Pourquoi est-ce que j'obtiens "IndentationError : expected an indented block" ?

if len(trashed_files) == 0 :
    print "No files trashed from current dir ('%s')" % os.path.realpath(os.curdir)
else :
    index=raw_input("What file to restore [0..%d]: " % (len(trashed_files)-1))
    if index == "*" :
        for tfile in trashed_files :
            try:
                tfile.restore()
            except IOError, e:
                import sys
                print >> sys.stderr, str(e)
                sys.exit(1)
    elif index == "" :
        print "Exiting"
    else :
        index = int(index)
        try:
            trashed_files[index].restore()
        except IOError, e:
            import sys
            print >> sys.stderr, str(e)
            sys.exit(1)

J'ai compris :

        elif index == "" :
        ^
    IndentationError: expected an indented block

0 votes

Question connexe sur les IndentationErrors no causés par des espaces blancs mélangés : Je reçois une IndentationError. Comment puis-je le corriger ?

86voto

Mark Points 49079

Comme l'indique le message d'erreur, vous avez une erreur d'indentation. Elle est probablement due à un mélange de tabulations et d'espaces.

5 votes

La première chose à laquelle j'ai pensé, alors j'ai converti toutes les tabulations en 4 espaces.

1 votes

@BHare : Et... ça n'a pas réglé le problème ? J'ai juste copié et collé votre code, et ajouté une ligne, trashed_files = ['a','b'] pour que ça fonctionne... ça ne m'a pas donné d'erreur d'indentation.

0 votes

J'ai refait le remplacement, puis j'ai réécrit la ligne if len(trashed_files) == 0 : parce que la tabulation était bizarre sur stackoverflow... il s'est avéré que c'était le problème... aucune idée de pourquoi/quoi. C'était la même chose dans nano.

42voto

Xavier C. Points 990

Il y a en fait plusieurs choses que vous devez savoir sur l'indentation en Python :

Python se soucie vraiment de l'indention.

Dans beaucoup d'autres langues, le tiret n'est pas nécessaire mais améliore la lisibilité. En Python, l'indentation remplace le mot-clé begin / end ou { } et est donc nécessaire.

Ceci est vérifié avant l'exécution du code, donc même si le code avec l'erreur d'indentation n'est jamais atteint, il ne fonctionnera pas.

Il y a différentes erreurs d'indentation et le fait de les lire aide beaucoup :

1. "IndentationError : expected an indented block" (Erreur d'indentation : on s'attendait à un bloc indenté)

Il y a deux raisons principales pour lesquelles vous pourriez avoir une telle erreur :

- Vous avez un " :" sans un bloc en retrait derrière.

Voici deux exemples :

Exemple 1, pas de bloc en retrait :

Entrée :

if 3 != 4:
    print("usual")
else:

Sortie :

  File "<stdin>", line 4

    ^
IndentationError: expected an indented block

Le résultat indique que vous devez avoir un bloc indenté à la ligne 4, après l'élément else: déclaration

Exemple 2, bloc non indenté :

Entrée :

if 3 != 4:
print("usual")

Sortie

  File "<stdin>", line 2
    print("usual")
        ^
IndentationError: expected an indented block

Le résultat indique que vous devez avoir un bloc indenté ligne 2, après l'élément if 3 != 4: déclaration

- Vous utilisez Python2.x et vous avez un mélange de tabulations et d'espaces :

Entrée

def foo():
    if 1:
        print 1

Veuillez noter qu'avant if, il y a une tabulation, et avant print, il y a 8 espaces.

Sortie :

  File "<stdin>", line 3
    print 1
      ^
IndentationError: expected an indented block

C'est assez difficile de comprendre ce qui se passe ici, il semble qu'il y ait un bloc d'indentation... Mais comme je l'ai dit, j'ai utilisé des tabulations et des espaces, et vous ne devriez jamais faire cela.

  • Vous pouvez obtenir des informations ici .
  • Supprimez toutes les tabulations et remplacez-les par quatre espaces.
  • Et configurez votre éditeur pour qu'il le fasse automatiquement.

2. "IndentationError : indentation inattendue"

Il est important d'indenter les blocs, mais uniquement les blocs qui doivent l'être. Donc, en gros, cette erreur dit :

- Vous avez un bloc en retrait sans un " :" avant.

Exemple :

Entrée :

a = 3
  a += 3

Sortie :

  File "<stdin>", line 2
    a += 3
    ^
IndentationError: unexpected indent

La sortie indique qu'il ne s'attendait pas à un bloc de retrait ligne 2, alors vous devriez le supprimer.

3. "TabError : utilisation incohérente des tabulations et des espaces dans l'indentation" (python3.x uniquement)

  • Vous pouvez obtenir des informations ici .
  • Mais en fait, vous utilisez des tabulations et des espaces dans votre code.
  • Tu ne veux pas ça.
  • Supprimez toutes les tabulations et remplacez-les par quatre espaces.
  • Et configurez votre éditeur pour qu'il le fasse automatiquement.

Finalement, pour revenir sur votre problème :

Il suffit de regarder le numéro de ligne de l'erreur, et de la corriger en utilisant les informations précédentes.

3voto

maxomai Points 31

J'ai eu ce même problème et j'ai découvert (via cette réponse à une question similaire ) que le problème était que je n'avais pas indenté correctement la docstring. Malheureusement, IDLE ne donne pas de retour utile ici, mais une fois que j'ai corrigé l'indentation de la docstring, le problème a disparu.

Plus précisément --- un mauvais code qui génère des erreurs d'indentation :

def my_function(args):
"Here is my docstring"
    ....

Un bon code qui évite les erreurs d'indentation :

def my_function(args):
    "Here is my docstring"
    ....

Note : Je ne dis pas ça es le problème, mais qu'il pourrait être car dans mon cas, c'est le cas !

1voto

Haseeb Pervaiz Points 13

En python le bloc prévu signifie qu'il y a tout ce qui doit être écrit de cette manière dans mon cas je l'ai écrit de cette façon

 def btnClick(numbers):
 global operator
 operator = operator + str(numbers)
 text_input.set(operator)

Note.its give me error,until I written it in this way such that "giving spaces" then its giving me a block as I am trying to show you in function below code

def btnClick(numbers):
___________________________
|global operator
|operator = operator + str(numbers)
|text_input.set(operator)

0voto

user3317399 Points 21

Vous pourriez vouloir vérifier vos espaces et vos tabulations. Une tabulation est une valeur par défaut de 4 espaces. Cependant, vos "if" et "elif" correspondent, donc je ne sais pas vraiment pourquoi. Allez dans Options dans la barre supérieure, et cliquez sur "Configurer IDLE". Vérifiez la largeur d'indentation sur la droite dans Fonts/Tabs, et assurez-vous que vos indentations ont ce nombre d'espaces.

0 votes

Editer avec "IDLE" aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X