2010-06-04 9 views
9

ten nie może być niedobór ziemia wstrząsającego z pytona, ale nadal dziwnego o uzasadnienie następujące zachowanie: Kiedy runbłąd składni dziwne w Pythonie, wersja 2.6 i 3.1

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

#""" 

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

ja Get ::

File "<whatever>", line 6 
    # 
    ^
SyntaxError: invalid syntax 

mogę uniknąć tego wyjątku (1) usunięcie z tyłu #; (2) usuwanie lub odrzucanie linii if __name__ == '__main__':\n print('yeah!'); (3) dodaj znak nowej linii do końca źródła .

Co więcej, jeśli mam końcówkę źródłową bez ciągłej nowej linii prawa za print('yeah!'), źródło będzie również kompilować bez błędu .

Mogę również odtworzyć to zachowanie w Pythonie 2.6, więc nie jest nowy do serii 3k.

Uważam, że ten błąd jest bardzo irytujący, tym bardziej, że kiedy i umieści się nad źródłem wewnątrz pliku i wykona go bezpośrednio, lub gdy zostanie zaimportowany, nie wystąpi błąd - co jest oczekiwanym zachowaniem.

a # (hash) poza literałem ciągu znaków zawsze powinien reprezentować początek (prawdopodobnie pusty) komentarza w źródle pythona; co więcej, obecność lub nieobecność klauzuli if __name__ == '__main__' powinna spowodować, że nie zmieni interpretacji pliku na poziomie syntaktycznym.

Czy ktoś może odtworzyć powyższy problem i/lub skomentować zjawisko ?

okrzyki

+0

Udało mi się to odtworzyć. Bizarre - również jestem zainteresowany odpowiedzią. –

+0

Powielane w wersji 2.6.1. Wydaje się, że jest to również błąd dla mnie, ale jest to dość skrajny przypadek. –

+3

Możesz umieścić swoją "aktualizację" jako odpowiedź i zaakceptować to. – kennytm

Odpowiedz

3

aktualizacji

wyproszeni to rzeczywiście bug jak podkreślił http://groups.google.com/group/comp.lang.python/msg/b4842cc7abd75fe9; raport o błędzie znajduje się pod adresem http://bugs.python.org/issue1184112; wydaje się być ustalone w 2.7 i 3.2.

rozwiązanie

raz rozpoznana, ten błąd jest bardzo proste do ustalenia: od poprawnym źródłem python powinny pozostać zarówno składniowo poprawny i semantycznie niezmienione, gdy nowa linia zostaje dodana do tekstu źródłowego, tylko mechanicznie nie tylko to, aby każdy tekst źródłowy. to przypomina mi średnik, który mechanicznie wstawiasz między tekstami źródłowymi podczas kompilowania wieloskładnikowego źródła javascript dla wydajnego dostarczania gzipem do klienta zdalnego.