Que faire avec "Indentation inattendue" en python?

117

Comment corriger l'erreur "indentation inattendue" en python?

Ventilateur Macintosh
la source
4
Un fragment de code qui produit l'erreur nous aidera à mieux comprendre votre problème. Veuillez modifier votre question pour inclure du code.
RBerteig
7
Cela me semble être un problème d'espace blanc, donc un échantillon de code serait inutile.
James McMahon
Question vague et aucune réponse choisie.
rafael.js
"Comment rectifier l'erreur ..."? En identifiant l'endroit où cela s'est produit et en corrigeant la cause de l'erreur. Dans ce cas, en faisant en sorte que l'indentation de cette ligne particulière ressemble à ce que Python attend ...
twalberg

Réponses:

132

Python utilise l'espacement au début de la ligne pour déterminer le début et la fin des blocs de code. Les erreurs que vous pouvez obtenir sont:

Retrait inattendu. Cette ligne de code a plus d'espaces au début que la précédente, mais celle qui précède n'est pas le début d'un sous-bloc (par exemple l'instruction if / while / for). Toutes les lignes de code d'un bloc doivent commencer par exactement la même chaîne d'espaces. Par exemple:

>>> def a():
...   print "foo"
...     print "bar"
IndentationError: unexpected indent

Celui-ci est particulièrement courant lors de l'exécution interactive de python: assurez-vous de ne pas mettre d'espaces supplémentaires avant vos commandes. (Très ennuyeux lors du copier-coller de code d'exemple!)

>>>   print "hello"
IndentationError: unexpected indent

Unindent ne correspond à aucun niveau d'indentation externe. Cette ligne de code a moins d'espaces au début que la précédente, mais elle ne correspond également à aucun autre bloc dont elle pourrait faire partie. Python ne peut pas décider où il va. Par exemple, dans ce qui suit, l'impression finale est-elle censée faire partie de la clause if, ou non?

>>> if user == "Joey":
...     print "Super secret powers enabled!"
...   print "Revealing super secrets"
IndendationError: unindent does not match any outer indentation level

Attendu un bloc en retrait. Cette ligne de code a le même nombre d'espaces au début que la précédente, mais la dernière ligne devait commencer un bloc (par exemple, instruction if / while / for, définition de fonction).

>>> def foo():
... print "Bar"
IndentationError: expected an indented block

Si vous voulez une fonction qui ne fait rien, utilisez la commande "no-op" pass :

>>> def foo():
...     pass

Le mélange d'onglets et d'espaces est autorisé (au moins sur ma version de Python), mais Python suppose que les onglets comportent 8 caractères, ce qui peut ne pas correspondre à votre éditeur. Dites simplement "non" aux onglets. La plupart des éditeurs permettent leur remplacement automatique par des espaces.

La meilleure façon d'éviter ces problèmes est de toujours utiliser un nombre constant d'espaces lorsque vous indentez un sous-bloc, et idéalement d'utiliser un bon IDE qui résout le problème pour vous. Cela rendra également votre code plus lisible.

Alice Purcell
la source
7
bonne explication. En plus de cela, j'ai également passé indentation Erreur inattendue quand il a mélangé des espaces avec «tab» et «barre d'espace» dans NotePad ++, remplacez le «tab» par «espaces» et corrigé.
José Rosas Sáenz
2
@ JoséRosasSáenz Votre commentaire m'a sauvé tant d'ennuis
user3726345
Une autre cause est de manquer la exceptpartie d'une tryclause. Le code a l'air correct (en ce que la ligne non indentée est censée être en dehors du trybloc) mais Python le signale comme une erreur de «retrait inattendu». Ceci est corrigé en ajoutant le except, peut-être en utilisant pass(comme ici )
dumbledad
@dumbledad Sur quelle version de python voyez-vous cela? Quand j'essaye le mien (2.7.15 et 3.6.8), j'obtiens une SyntaxError
Alice Purcell
J'ai rencontré cette erreur lors du copier / coller de code à partir d'un site Web. Le positionnement semblait correct mais j'avais besoin de supprimer l'espace blanc et de le réappliquer en utilisant des espaces avant que QGIS (3.10) n'exécute le code.
benj
23

En Python, l'espacement est très important, cela donne la structure de vos blocs de code. Cette erreur se produit lorsque vous gâchez votre structure de code, par exemple comme ceci:

def test_function() :
   if 5 > 3 :
   print "hello"

Vous pouvez également avoir un mélange d'onglets et d'espaces dans votre fichier.

Je vous suggère d'utiliser un éditeur compatible avec la syntaxe Python comme PyScripter ou Netbeans

yanjost
la source
1
Oui, utilisez certainement des éditeurs compatibles python! J'ai eu un problème où je modifiais dans notepad ++ avec les paramètres par défaut et les espaces blancs étaient erronés
Dave Archer
2
des tabulations et des espaces mixtes soulèvent "SyntaxError: utilisation incohérente des tabulations et des espaces dans l'indentation"
SilentGhost
À titre informatif, le plugin Python Netbeans ne convertit actuellement pas les onglets en espaces à partir du code existant. Cependant, il le fera lorsque vous écrivez un nouveau code.
James McMahon
PyCharm peut le convertir de manière cohérente. Il mettra également en évidence les lignes «faute». J'utilise des citations parce que ce ne sont pas les années 1960 et je ne peux pas croire qu'un langage merveilleux tel que Python ait encore cette faille qui fait perdre du temps.
Echelon
J'ai involontairement changé d'éditeur à mi-chemin de l'écriture de mon code et cela a bourré mes retraits dans le nouveau code. Le changement n'était pas évident à l'oeil, mais l'interprète ne voulait pas exécuter mon code. Ce message m'a aidé à trouver le problème.
Lucien Stals
21

Exécutez votre code avec l'option -tt pour savoir si vous utilisez des tabulations et des espaces de manière incohérente

Manoj I
la source
16

Activez les espaces visibles dans l'éditeur que vous utilisez et activez le remplacement des onglets par des espaces.

Bien que vous puissiez utiliser des onglets avec Python, le mélange d'onglets et d'espace entraîne généralement l'erreur que vous rencontrez. Le remplacement des onglets par 4 espaces est l'approche recommandée pour écrire du code Python.

James McMahon
la source
1
Comment faites-vous cela? J'utilise Sublime.
chibole
8

En utilisant une indentation correcte. Python est conscient des espaces, vous devez donc suivre ses directives d'indentation pour les blocs ou vous obtiendrez des erreurs d'indentation.

workmad3
la source
6

Si vous écrivez Python en utilisant Sublime et obtenez des erreurs d'indentation,

vue -> indentation -> convertir l'indentation en espaces

Le problème que je décris est causé par l'éditeur de texte Sublime. Le même problème peut également être causé par d'autres éditeurs. Essentiellement, le problème est lié au fait que Python souhaite traiter les indentations en termes d'espaces par rapport à divers éditeurs codant les indentations en termes d'onglets.

Puneet Lamba
la source
oh ... alors est-ce que sublime cause ça?
nitin
Oui, le problème que je décris est causé par Sublime. Cela pourrait également être causé par d'autres éditeurs. Essentiellement, le problème est lié au fait que Python souhaite traiter les indentations en termes d'espaces par rapport à divers éditeurs codant les indentations en termes d'onglets.
Puneet Lamba
J'ai eu le même problème avec notepad ++. Ce qui est vrai a donc pris un certain temps pour résoudre ce problème. J'ai dû déplacer le curseur un caractère à la fois pour comprendre que l'éditeur avait converti certains espaces en onglets
Bharat Anand
4

Assurez-vous d'utiliser l'option "insérer des espaces au lieu des tabulations" dans votre éditeur. Ensuite, vous pouvez choisir une largeur de tabulation de, par exemple 4. Vous pouvez trouver ces options dans gedit sous edit -> preferences -> editor.

ligne du bas: UTILISEZ LES ESPACES pas les onglets

Alex
la source
Votre résultat net a fait l'affaire!
Nick Div ​​le
3

Cette erreur peut également se produire lors du collage de quelque chose dans l'interpréteur Python (terminal / console).

Notez que l'interpréteur interprète une ligne vide comme la fin d'une expression, donc si vous collez quelque chose comme

def my_function():
    x = 3

    y = 7

l'interpréteur interprétera la ligne vide avant y = 7comme la fin de l'expression, c'est-à-dire que vous avez fini de définir votre fonction, et la ligne suivante - y = 7aura une indentation incorrecte car c'est une nouvelle expression.

Zoltán
la source
clé étant que les lignes vides dans la définition de la fonction sont bien, mais elles doivent toujours avoir l'espace blanc initial puisque Python interprète toute ligne vide comme la fin de la fonction
MichaelChirico
3

Un problème qui ne semble pas avoir été mentionné est que cette erreur peut survenir en raison d'un problème avec le code qui n'a rien à voir avec l'indentation.

Par exemple, prenez le script suivant:

def add_one(x):
    try:
        return x + 1
add_one(5)

Cela renvoie un IndentationError: unexpected unindentlorsque le problème est bien sûr une except:instruction manquante .

Mon point: vérifiez le code ci-dessus où le retrait inattendu est signalé!

WMoreland
la source
2

Si l'indentation semble correcte, jetez un œil pour voir si votre éditeur a une option "Afficher les espaces". L'activer devrait permettre de trouver où les espaces et les tabulations sont mélangés.


la source
2

Il y a une astuce qui a toujours fonctionné pour moi:

Si vous avez un retrait inattendu et que vous voyez que tout le code est parfaitement en retrait, essayez de l'ouvrir avec un autre éditeur et vous verrez quelle ligne de code n'est pas en retrait.

Cela m'est arrivé lorsque j'ai utilisé vim, gedit ou des éditeurs comme ça.

Essayez de n'utiliser qu'un seul éditeur pour votre code.

Jésus Rodriguez
la source
2

Copiez simplement votre script et mettez sous "" "tout votre code" "" ...

spécifiez cette ligne dans une variable .. comme,

a = """ your python script """
print a.replace('here please press tab button it will insert some space"," here simply press space bar four times")
# here we replacing tab space by four char space as per pep 8 style guide..

maintenant exécutez ce code, dans Sublime Editor en utilisant ctrl + b, maintenant il imprimera le code indenté dans la console. c'est tout

Mohideen bin Mohammed
la source
comment vais-je exécuter mon code. Dois-je supprimer le "" "et" "" et l'impression a.replace et l'exécuter normalement?
chibole
aucun "" "" "" (guillemets triples) ne fait référence à votre contenu plutôt qu'à une chaîne. son obligatoire car votre code peut contenir une chaîne contenant des guillemets simples / doubles, donc "" "obligatoire.
Mohideen bin Mohammed
2

Tout ce que vous devez faire est de supprimer les espaces ou les tabulations au début des codes suivants

from django.contrib import admin

# Register your models here.
from .models import Myapp
admin.site.register(Myapp)
Sunil Tamang
la source
2

Exécutez la commande suivante pour le résoudre:

autopep8 -i <filename>.py

Cela mettra à jour votre code et résoudra toutes les erreurs d'indentation :)

J'espère que cela résoudra

Sharyar Vohra
la source
Très facile à mettre en œuvre. Fonctionne pour moi à chaque fois, c'est pourquoi j'ai partagé j'espère que cela sera bénéfique pour quelqu'un :)
Sharyar Vohra
1

Notepad ++ donnait l'espace de tabulation correct mais le problème d'indentation a finalement été trouvé dans l'éditeur de texte Sublime.

Utilisez l'éditeur de texte Sublime et allez ligne par ligne

HimalayanCoder
la source
0

L'indentation en Python est importante et ce n'est pas pour la lisibilité du code, contrairement à de nombreux autres langages de programmation. S'il y a un espace blanc ou une tabulation dans votre code entre des commandes consécutives, python donnera cette erreur car Python y est sensible. Nous sommes susceptibles d'obtenir cette erreur lorsque nous copions et collons du code sur n'importe quel Python. Assurez-vous d'identifier et de supprimer ces espaces à l'aide d'un éditeur de texte tel que Notepad ++ ou supprimez manuellement l'espace blanc de la ligne de code où vous obtenez une erreur.

Step1 :Gives error 
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])

Step2: L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]print(L[2: ])

Step3: No error after space was removed
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])
OUTPUT: [[7, 8, 9, 10]]

Merci!

ashu Kr
la source