Recherche…


Erreurs d'indentation

L'espacement doit être uniforme et uniforme partout. Une indentation incorrecte peut provoquer une IndentationError ou provoquer des imprévus dans le programme. L'exemple suivant déclenche une IndentationError :

a = 7
if a > 5:
  print "foo"
else:
  print "bar"
 print "done"

Ou si la ligne qui suit un deux-points n'est pas en retrait, une IndentationError d' IndentationError sera également déclenchée:

if True:
print "true"

Si vous ajoutez une indentation là où elle n'appartient pas, une IndentationError d' IndentationError sera IndentationError :

if  True:
    a = 6
        b = 5

Si vous oubliez de ne pas indenter la fonctionnalité pourrait être perdu. Dans cet exemple, None est renvoyé au lieu de False attendu:

def isEven(a):
    if a%2 ==0:
        return True
        #this next line should be even with the if
        return False
print isEven(7)

Exemple simple

Pour Python, Guido van Rossum a basé le regroupement des déclarations sur l'indentation. Les raisons en sont expliquées dans la première section de la "FAQ Python Design and History" . Colons, : , sont utilisés pour déclarer un bloc de code en retrait , comme dans l'exemple suivant:

class ExampleClass:
    #Every function belonging to a class must be indented equally
    def __init__(self):
        name = "example"

    def someFunction(self, a):
        #Notice everything belonging to a function must be indented
        if a > 5:
            return True
        else:
            return False

#If a function is not indented to the same level it will not be considers as part of the parent class
def separateFunction(b):
    for i in b:
    #Loops are also indented and nested conditions start a new indentation
        if i == 1:
            return True
    return False

separateFunction([2,3,5,6,1])

Espaces ou onglets?

L' indentation recommandée est de 4 espaces, mais des tabulations ou des espaces peuvent être utilisés tant qu'ils sont cohérents. Ne mélangez pas les onglets et les espaces dans Python, car cela provoquerait une erreur dans Python 3 et pourrait provoquer des erreurs dans Python 2 .

Comment l'indentation est analysée

Les espaces blancs sont traités par l'analyseur lexical avant d'être analysés.

L'analyseur lexical utilise une pile pour stocker les niveaux d'indentation. Au début, la pile contient juste la valeur 0, qui est la position la plus à gauche. Chaque fois qu'un bloc imbriqué commence, le nouveau niveau d'indentation est poussé sur la pile et un jeton "INDENT" est inséré dans le flux de jetons qui est transmis à l'analyseur. Il ne peut jamais y avoir plus d'un jeton "INDENT" dans une ligne ( IndentationError ).

Lorsqu'une ligne est rencontrée avec un niveau d'indentation plus petit, les valeurs sont extraites de la pile jusqu'à ce que la valeur soit supérieure au nouveau niveau d'indentation (si aucune valeur n'est trouvée, une erreur de syntaxe se produit). Pour chaque valeur sautée, un jeton "DEDENT" est généré. De toute évidence, il peut y avoir plusieurs jetons "DEDENT" à la suite.

L'analyseur lexical ignore les lignes vides (celles ne contenant que des espaces et éventuellement des commentaires) et ne générera jamais de jeton "INDENT" ou "DEDENT" pour ces dernières.

A la fin du code source, des jetons "DEDENT" sont générés pour chaque niveau d'indentation laissé sur la pile, jusqu'à ce qu'il ne reste que le 0.

Par exemple:

if foo:
    if bar:
        x = 42
else:
    print foo

est analysé comme:

<if> <foo> <:>                    [0]
<INDENT> <if> <bar> <:>           [0, 4]
<INDENT> <x> <=> <42>             [0, 4, 8]
<DEDENT> <DEDENT> <else> <:>      [0]
<INDENT> <print> <foo>            [0, 2]
<DEDENT> 

L'analyseur traite les jetons "INDENT" et "DEDENT" en tant que délimiteurs de bloc.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow