サーチ…


インデントエラー

間隔は全体を通して均一で均一でなければならない。不適切な字下げは、 IndentationError引き起こしたり、プログラムが予期せぬことをする原因となります。次の例では、 IndentationErrorます。

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

または、コロンに続く行がインデントされていない場合、 IndentationErrorも発生します。

if True:
print "true"

所属していないインデントを追加すると、 IndentationErrorが発生します。

if  True:
    a = 6
        b = 5

字下げを忘れると、機能が失われる可能性があります。この例では、 False代わりにNoneが返されます。

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

簡単な例

Pythonの場合、Guido van Rossumは字下げに関する文のグループ化に基づいていました。この理由は、「デザインとヒストリーPythonのFAQ」の最初のセクションで説明されています。コロンは、 : 、するために使用されるインデントコードブロックを宣言し 、次の例のように、。

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

スペースやタブ?

推奨インデントは4スペースですが、一貫している限り、タブまたはスペースを使用できます。 Python 3でエラーが発生し、 Python 2でエラーが発生する可能性があるため、 Pythonではタブとスペースを混用しないでください

インデントがどのように解析されるか

空白は、解析される前に字句解析ツールによって処理されます。

レキシカルアナライザは、インデントレベルを格納するためにスタックを使用します。最初のスタックには値0が含まれています。これは一番左の位置です。ネストされたブロックが始まると、新しいインデントレベルがスタックにプッシュされ、 "INDENT"トークンがパーサーに渡されるトークンストリームに挿入されます。 1つの行に複数の "INDENT"トークンが存在することはありません( IndentationError )。

より小さな字下げレベルで行が見つかると、新しい字下げレベルに等しい値が上になるまで値がスタックからポップされます(見つからない場合は構文エラーが発生します)。ポップされた各値に対して、「DEDENT」トークンが生成されます。明らかに、複数の「DEDENT」トークンが連続して存在する可能性があります。

字句アナライザは、空白行(空白とコメントのみを含む)をスキップし、それらのために「インデント」または「デデンタ」トークンを生成しません。

ソースコードの最後には、スタック上に残されたインデントレベルごとに "DEDENT"トークンが生成され、0だけが残されます。

例えば:

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

次のように分析される:

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

パーサーは、ブロック区切り文字として "INDENT"と "DEDENT"トークンを処理します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow