2010-06-04 10 views
9

cela peut ne pas être une terre bouleversante carence en python, mais je reste interroger sur la raison d'être le comportement suivant: quand je courseétrange erreur de syntaxe en Python, version 2.6 et 3.1

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

#""" 

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

i :: obtenir

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

je peux éviter cette exception par (1) la suppression du # arrière; (2) en supprimant ou en supprimant les lignes if __name__ == '__main__':\n print('yeah!'); (3) ajouter une nouvelle ligne à la fin de la source .

Par ailleurs, si j'ai la fin de la source sans fin de ligne droite derrière le print('yeah!'), la source compilera également sans erreur.

Je pourrais également reproduire ce comportement avec python 2.6, donc ce n'est pas nouveau à la série 3k.

je trouve cette erreur d'être très irritant, d'autant plus que quand je mis dessus d'une source dans un fichier et l'exécuter directement ou avoir importé, aucune erreur ne se produit, qui est le comportement attendu.

un # (hash) en dehors d'une chaîne littérale doit toujours représenter le début d'un commentaire (éventuellement vide) dans une source python; de plus, la présence ou l'absence d'une clause if __name__ == '__main__' ne devrait pas modifier l'interprétation d'une soure au niveau syntaxique.

Quelqu'un peut-il reproduire le problème ci-dessus, et/ou commenter le phénomène ?

acclamations

+0

J'ai été capable de le reproduire. Bizarre - Je suis intéressé par la réponse aussi. –

+0

Reproduit en 2.6.1. Cela semble être un bug pour moi aussi, mais c'est un cas extrême. –

+3

Vous pourriez mettre votre "mise à jour" comme réponse et l'accepter. – kennytm

Répondre

3

mise à jour

tours c'est en effet un bug comme l'a souligné http://groups.google.com/group/comp.lang.python/msg/b4842cc7abd75fe9; le rapport de bug est au http://bugs.python.org/issue1184112; il semble être fixé en 2.7 et 3.2.

solution

une fois reconnu, ce bug est extrêmement simple à résoudre: depuis une source python valide doit rester à la fois syntaxiquement valide et sémantiquement inchangé quand un saut de ligne est ajouté au texte source, il suffit de faire mécaniquement juste que pour tout texte source. Cela me rappelle le point-virgule ; que vous mettez mécaniquement entre les textes source lors de l'assemblage d'une source javascript multi-fichiers pour une distribution gzippée efficace vers le client distant.