Python Language
インデント
サーチ…
インデントエラー
間隔は全体を通して均一で均一でなければならない。不適切な字下げは、 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"トークンを処理します。