2010-06-04 7 views
9

esto puede no ser una deficiencia de terremoto de pitón, pero todavía se preguntan acerca de la razón de ser de la siguiente comportamiento: cuando plazoerror de sintaxis extraña en Python, versión 2.6 y 3.1

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

#""" 

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

i Get ::

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

i puedo evitar esta excepción por (1) la supresión de la # de salida; (2) borrando o superando las líneas if __name__ == '__main__':\n print('yeah!'); (3) agregue una nueva línea al final de la fuente .

por otra parte, si tengo el extremo fuente sin un salto de línea final justo detrás de la print('yeah!'), la fuente también se compilará sin error.

también podría reproducir este comportamiento con Python 2.6, por lo que no es nuevo a la serie 3k.

Me parece que este error sea altamente irritante, tanto más cuanto que cuando me puse por encima de la fuente dentro de un archivo y ejecutarlo directamente o tienen que importada, no se producirá ningún error, lo cual es el comportamiento esperado.

a # (hash) fuera de una cadena literal siempre debe representar el comienzo de un comentario (posiblemente vacío) en una fuente de Python; además, la presencia o ausencia de de una cláusula if __name__ == '__main__' debería no cambiar la interpretación de un soure en un nivel sintáctico.

¿Alguien puede reproducir el problema anterior y/o comentar sobre el fenómeno ?

aplausos

+0

Pude reproducirlo. Bizarre - También estoy interesado en la respuesta. –

+0

Reproducido en 2.6.1. También parece ser un error para mí, pero es un caso bastante extremo. –

+3

Puede poner su "actualización" como respuesta y aceptarla. – kennytm

Respuesta

3

actualización

resulta que esto es de hecho un error como ha señalado http://groups.google.com/group/comp.lang.python/msg/b4842cc7abd75fe9; el informe de error está en http://bugs.python.org/issue1184112; parece estar fijo en 2.7 y 3.2.

solución

una vez reconocido, este error es extremadamente sencillo de solucionar: desde una fuente de Python válida debe permanecer tanto sintácticamente válida y semánticamente sin cambios cuando se añade una nueva línea en el texto de origen, solo mecánicamente hacer eso a cualquier texto de origen. esto me recuerda el punto y coma ; que coloca mecánicamente entre los textos fuente al ensamblar una fuente javascript de varios archivos para una entrega gzipped eficiente al cliente remoto.