2010-06-04 2 views
9

이 파이썬의 지구를 깜짝 놀라게 결핍 될 수 있지만하지 않을 수 있습니다 난 여전히 다음과 같은 동작 뒤에있는 근거에 대한 궁금해 : 때 실행이상한 구문 오류, 버전 2.6 및 3.1

source = """ 
print('helo') 
if __name__ == '__main__': 
    print('yeah!') 

#""" 

print(compile(source, '<whatever>', 'exec')) 

전 get ::

나는이 예외를 피하기 위해 (1) 후행 #; (2) if __name__ == '__main__':\n print('yeah!') 행을 삭제하거나 outcommenting; (3) 소스의 맨 끝에 개행을 추가하십시오.

오류없이 소스 코드 끝에 print('yeah!') 뒤에 오른쪽 끝 줄 바꿈이 없으면 소스가 컴파일됩니다.

또한이 동작을 파이썬 2.6에서 재현 할 수 있으므로 새로운 3k 시리즈 이 아닙니다.

위의 내용을 파일 내에두고 직접 실행하거나 을 가져 오면 아무런 오류가 발생하지 않으므로이 오류는 매우 짜증나게됩니다. 예상되는 동작입니다.

# (해시) 문자열 리터럴 외부는 항상 파이썬 소스에서 (비어 있음) 주석의 시작을 나타내야합니다. 또한 if __name__ == '__main__' 절이 있는지 여부는 이 구문 수준에서 soure의 해석을 변경하지 않아야합니다.

누구나 위의 문제를 재현하고/또는 현상에 대한 의견을 보낼 수 있습니까?

환호

+0

재현 할 수있었습니다. 기괴한 - 나는 대답에도 관심이있다. –

+0

2.6.1에서 재현되었습니다. 그것은 나에게도 버그 인 것처럼 보이지만 꽤 극단적 인 경우입니다. –

+3

"업데이트"를 답으로 받아 들일 수 있습니다. – kennytm

답변

3

갱신

이 실제로 http://groups.google.com/group/comp.lang.python/msg/b4842cc7abd75fe9에 의해 지적 버그가 밝혀; 버그 신고는 http://bugs.python.org/issue1184112입니다. 그것은 2.7과 3.2에서 고정 된 것처럼 보입니다.

솔루션

한 번 인식,이 버그가 수정하는 것은 매우 간단하다 : 유효한 파이썬 소스가 모두 구문 적으로 유효하고 줄 바꿈이 소스 텍스트에 추가 될 때 의미 변경 유지해야하기 때문에, 단지 기계적으로 하나에 그냥 할 원본 텍스트. 이것은 리모트 클라이언트로의 효율적인 gzip 전송을 위해 다중 파일 자바 스크립트 소스를 어셈블 할 때 소스 텍스트 사이에 기계적으로 넣는 세미콜론 인 ;을 생각 나게합니다.