python / python/cpython

Incorrect SyntaxError attributes when raised by `compile`

Ouverte
#127,927 11 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

interpreter-core type-bug
Langage dominant
Python
Étoiles
77.2k
Forks
36k
Métriques de merge des PR
Métriques de PR en attente

Description

Bug report

Bug description:

This is probably a problem with compile, and I will demonstrate it through ast.parse. Consider the following code in a file f.py.

import ast

code = "x y"
ast.parse(code, filename='f.py')

This correctly raises a SyntaxError with lineno = 1 and offset = 3 since the error is at the beginning of y in the code. However, the traceback points into the file f.py itself, instead of the string code. Notice that it points to the third column of the first line of f.py.

  File "f.py", line 1
    import ast
      ^
SyntaxError: invalid syntax

This does not happen for any other string given as filename to ast.parse. In general, the traceback seems to point with the "correct" lineno and offset to the code in the file itself instead of code given to ast.parse. However, the problem is slightly more nuanced. If the offset in the string given to ast.parse is more than the length of the corresponding line in f.py, the offset attribute of the SyntaxError raised is incorrectly set to the length of the corresponding line in f.py plus two. Consider the following code in f.py.

import ast

code = "                                     x y"
ast.parse(code, filename='f.py')

This raises the following exception.

  File "f.py", line 1
    import ast
              ^
IndentationError: unexpected indent

On closer inspection, it turns out that the offset of the exception raised is 12 (note that the length of "import ast" is 10) instead of the correct 37 which is observed when filename is set to anything other than f.py. However, something more interesting happens when the number of lines in the code string is more than the number of lines in the file f.py.

import ast

code = "\n\n\n\nx y"
ast.parse(code, filename='f.py')

The problem goes away!

  File "f.py", line 5
    x y
      ^
SyntaxError: invalid syntax

We even see the correct offset.

CPython versions tested on:

3.11, 3.12, 3.13

Operating systems tested on:

Linux

(Edit) Incorrect text attribute

There is something more going on here. The following issue can be seen in 3.11 and 3.12 but not in 3.13. Consider the following f.py.

import ast

with open('temp.py') as f:
    code = f.read()
ast.parse(code, filename='temp.py')

temp.py is as follows.

"""                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             """; x """                                                                                                                                                         """; foobar

This leads to the following traceback.

  File "temp.py", line 1
    foobar
          ^
SyntaxError: invalid syntax

Besides the fact that the offset is incorrectly set to 8 (instead of 840), the text is incorrectly set to foobar (on 3.13, the entire file contents of temp.py are present in text). This problem goes away if filename is set to anything else. The problem also goes away if the contents of temp.py are shorter!

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par reproduire les exemples avec ast.parse et compile, en comparant les attributs de SyntaxError lorsque filename correspond au fichier source et lorsqu’il ne correspond pas. Suivez la manière dont traceback, offset et text sont renseignés pour les noms de fichier correspondants. Le travail est considéré comme terminé lorsque lineno, offset, text et traceback décrivent systématiquement la chaîne analysée dans les cas présentés, avec une couverture de régression pour les exemples.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
compilers
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
38/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.