python / python/cpython

tokenize: `e.offset` on `IndentationError` is not set correctly

Ouverte
#153,837 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

3.14 3.15 3.16 interpreter-core topic-parser 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:
import io, tokenize

input_s = """
def foo():
    x = 1
   x = "some_very_long_expression"
"""
try:
    list(tokenize.generate_tokens(io.StringIO(input_s).readline))
except IndentationError as e:
    print(f"{e.offset = }")

The line x = "some_very_long_expression" is indented with 3 spaces instead of 4, so we get an error.
We would expect the offset to be around 3, since that is where the issue is.
On python 3.12+, the offset is instead 35, equal to the length of the line + 1.

This appears to be caused by the refactor of tokenize done in 3.12 for PEP 701
Potentially related to https://github.com/python/cpython/issues/84515
Funnily enough, the exact same thing seems to have happened around 3.8 https://github.com/python/cpython/issues/75676

Tested versions:

Version e.offset
3.11.15 3
3.12.13 35
3.13.13 35
3.14.4 35
3.15.0b1 35

Testing command:
nix-shell -p python311 --run "python --version && python tmp.py"
(and replace 311 by 312, 313, etc)

CPython versions tested on:

3.15

Operating systems tested on:

Linux

Linked PRs
  • gh-154281

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 tokenize.generate_tokens et reproduisez l’exemple d’IndentationError fourni sur les versions de Python indiquées. Suivez la manière dont le tokenizer construit IndentationError et comparez l’offset avec le comportement de Python 3.11. C’est terminé lorsque la ligne mal indentée signale un offset proche de 3, avec une couverture de régression pour l’exemple.

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é
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

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