2010-06-04 10 views
9

questo non può essere una carenza di sconvolgente di pitone, ma ho ancora meraviglia circa la logica dietro il seguente comportamento: quando ho corsastrano errore di sintassi in Python, versione 2.6 e 3.1

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

#""" 

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

i ottengo ::

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

posso evitare questa eccezione da (1) eliminando il trascinamento #; (2) eliminare o esagerare le linee if __name__ == '__main__':\n print('yeah!'); (3) aggiungere una nuova riga alla fine della sorgente .

inoltre, se ho fine sorgente senza fine riga destra dietro la print('yeah!'), l'origine sarà anche compilare senza errore.

potrei anche riprodurre questo comportamento con python 2.6, quindi non è nuovo alla serie 3k.

trovo questo errore per essere altamente irritante, tanto più che quando ho messo sopra fonte all'interno di un file ed eseguirlo direttamente o averlo importata, si verificherà il che nessun errore è il comportamento previsto.

un # (hash) al di fuori di una stringa letterale dovrebbe sempre rappresentare il inizio di un commento (possibilmente vuota) in una sorgente Python; inoltre, la presenza o l'assenza di if __name__ == '__main__' nella clausola non deve modificare l'interpretazione di un soure a livello sintattico .

qualcuno può riprodurre il problema precedente e/o commentare il fenomeno ?

acclamazioni

+0

Sono stato in grado di riprodurlo. Bizzarro - Anche io sono interessato alla risposta. –

+0

Riprodotto in 2.6.1. Sembra essere un bug anche per me, ma è un caso davvero estremo. –

+3

Puoi inserire il tuo "aggiornamento" come risposta e accettarlo. – kennytm

risposta

3

aggiornamento

Risulta questo è effettivamente un insetto come sottolinea http://groups.google.com/group/comp.lang.python/msg/b4842cc7abd75fe9; il bug report è http://bugs.python.org/issue1184112; sembra essere risolto in 2.7 e 3.2.

soluzione

una volta riconosciuto, questo bug è estremamente semplice da risolvere: poiché una sorgente Python valida dovrebbe rimanere sia sintatticamente valido e semanticamente invariato quando viene aggiunto un ritorno a capo al testo di partenza, solo meccanicamente fare proprio questo a qualsiasi testo sorgente. questo mi ricorda il punto e virgola ; che si inserisce meccanicamente tra i testi di origine quando si assembla un sorgente javascript multi-file per una consegna gzippata efficiente al client remoto.

Problemi correlati