수색…


들여 쓰기 오류

간격은 전체적으로 균등하고 균일해야합니다. 잘못 들여 쓰기가 발생할 수 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> 

구문 분석기는 블록 구분 기호로 "내재"및 "정식"토큰을 처리합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow