web-dev-qa-db-fra.com

Que faire avec un "retrait imprévu" en python?

Comment rectifier l'erreur "retrait imprévu" en python?

104
moni

Python utilise un 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 imprévu. 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, if/while/for statement). 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 d'un exemple de code!)

>>>   print "hello"
IndentationError: unexpected indent

nindent ne correspond à aucun niveau d'indentation externe. Cette ligne de code comporte au début moins d'espaces que la précédente, mais elle ne correspond pas non plus à un autre bloc dont elle pourrait faire partie. Python ne peut pas décider où il va. Par exemple, dans ce qui suit, l’empreinte 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

n bloc en retrait est attendu. 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 démarrer un bloc (par exemple, si/tant que/pour l'instruction, fonction définition).

>>> 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 de tabulations et d'espaces est autorisé (du moins sur ma version de Python), mais Python suppose que les tabulations comportent 8 caractères, ce qui peut ne pas correspondre à votre éditeur. Dites simplement "non" aux onglets. La plupart des éditeurs leur permettent d'être automatiquement remplacés par des espaces.

Le meilleur moyen d'éviter ces problèmes est de toujours utiliser un nombre cohérent d'espaces lorsque vous indenter 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.

124
Alice Purcell

En Python, l’espacement est très important, cela donne la structure de vos blocs de code. Cette erreur se produit lorsque vous bousillez la structure de votre 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 sensible à la syntaxe python, comme PyScripter , ou Netbeans

21
yanjost

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

18
Manoj I

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

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

15
James McMahon

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

8
workmad3

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 pourrait être causé par d'autres éditeurs. Le problème concerne essentiellement Python vouloir traiter les indentations en termes d'espaces par rapport aux différents éditeurs codant les indentations en termes d'onglets.

6
Puneet Lamba

Assurez-vous d'utiliser l'option "insérer des espaces au lieu d'onglets" dans votre éditeur. Vous pouvez ensuite choisir la largeur de tabulation souhaitée, par exemple 4. Vous pouvez trouver ces options dans gedit sous Éditer -> Préférences -> Éditeur.

ligne de fond: UTILISER LES ESPACES, pas les onglets

3
Alex

Cette erreur peut également se produire lorsque vous collez quelque chose dans l'interpréteur Python (terminal/console).

Notez que l'interprète 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ète interprétera la ligne vide précédant y = 7 comme la fin de l'expression, c'est-à-dire que vous avez terminé de définir votre fonction, et la ligne suivante - y = 7 aura un retrait incorrect, car il s'agit d'une nouvelle expression .

3
Zoltán

Si l'indentation vous semble correcte, vérifiez si votre éditeur dispose d'une option "Afficher les espaces". Activer ceci devrait permettre de trouver où les espaces et les onglets sont mélangés.

2
Kevan

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

Par exemple, prenons le script suivant:

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

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

Mon point: vérifiez le code ci-dessus où le ou les imprévus sont signalés!

2
WMoreland

Il y a un truc qui a toujours fonctionné pour moi:

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

Cela m'est arrivé lorsque vim, gedit ou des éditeurs de ce type ont été utilisés.

Essayez d'utiliser un seul éditeur pour votre code.

2
Jesus Rodriguez

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

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

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..

exécutez maintenant ce code, dans Sublime Editor à l’aide de ctrl + b, le code en retrait sera maintenant imprimé dans la console. c'est ça

2
Mohideen bin Mohammed

Notepad ++ donnait une espace de tabulation correcte, 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

1
HimalayanCoder

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

from Django.contrib import admin

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

Indentation in Python est important et ce n'est simplement pas pour la lisibilité du code, contrairement à beaucoup d'autres langages de programmation. S'il y a un espace ou une tabulation dans votre code entre des commandes consécutives, python donnera cette erreur, car Python est sensible à cela. Cette erreur risque de se produire lorsque nous copions et collons du code dans n’importe quel fichier Python. Assurez-vous d'identifier et de supprimer ces espaces à l'aide d'un éditeur de texte tel que Notepad ++ ou de supprimer manuellement les espaces 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!

0
ashu Kr