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은 들여 쓰기에 대한 그룹화를 기반으로합니다. 그 이유 는 "디자인 및 히스토리 파이썬 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"토큰이 파서에 전달되는 토큰 스트림에 삽입됩니다. 한 행에 두 개 이상의 "INDENT"토큰을 사용할 수 없습니다 ( IndentationError
).
더 작은 들여 쓰기 레벨로 라인을 만날 때, 새로운 들여 쓰기 레벨과 같은 값이 맨 위에 올 때까지 (값이없는 경우 구문 오류가 발생 함) 스택에서 값이 팝됩니다. 각각의 값에 대해 "DEDENT"토큰이 생성됩니다. 분명히 한 줄에 여러 "DEDENT"토큰이있을 수 있습니다.
어휘 분석기는 빈 줄 (공백과 주석 만 포함하는 줄)을 건너 뛰고 "인 덴트"또는 "데 덴트"토큰을 생성하지 않습니다.
소스 코드의 끝에서 0에 남을 때까지 스택에 남아있는 각 들여 쓰기 레벨에 대해 "DEDENT"토큰이 생성됩니다.
예 :
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>
구문 분석기는 블록 구분 기호로 "내재"및 "정식"토큰을 처리합니다.