SequenceMatcher.get_grouped_opcodes() changes the result of later get_opcodes() calls
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 78/100
Piste de recherche
Commencez par examiner le comportement signalé de SequenceMatcher.get_opcodes() et get_grouped_opcodes(), en utilisant le reproducer de l’issue pour comparer les résultats avant et après le regroupement. Le travail est terminé lorsque l’appel à get_grouped_opcodes() ne modifie plus les opcodes complets renvoyés ultérieurement et que le regroupement avec un n plus grand conserve le contexte attendu.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Bug report
SequenceMatcher.get_opcodes() caches its result and returns the same list on every call. get_grouped_opcodes() takes that list and overwrites its first and last entries to trim the context, so after one call the matcher's opcodes no longer cover the whole input, and a later get_grouped_opcodes() with a larger n shows less context than it should.
This was mentioned in gh-54194 back in 2010, but that issue was closed after only the get_matching_blocks() part was fixed (gh-65834); the get_grouped_opcodes() part is still there.
import difflib
old = ["line %d\n" % i for i in range(10)]
new = old[:]
new[5] = "changed\n"
sm = difflib.SequenceMatcher(None, old, new)
for group in sm.get_grouped_opcodes(1):
pass # show the hunks with one line of context
print(sm.get_opcodes())
Actual:
[('equal', 4, 5, 4, 5), ('replace', 5, 6, 5, 6), ('equal', 6, 7, 6, 7)]
Expected (what get_opcodes() returns before the get_grouped_opcodes() call):
[('equal', 0, 5, 0, 5), ('replace', 5, 6, 5, 6), ('equal', 6, 10, 6, 10)]
unified_diff() and context_diff() are not affected because they make a new matcher each time.
CPython versions tested on:
3.15, CPython main branch
Operating systems tested on:
Linux
Found while building a Lean 4 model of CPython (https://broyojo.com/python-formalization/). AI tools (Claude) helped investigate the findings and prepare this report. The examples were rerun on CPython 3.15.2 and main, and the report received technical review. Record: textlibs-difflib-grouped-opcodes-mutates-cache
- Langage dominant
- Python
- Étoiles
- 78.2k
- Forks
- 36.6k
- Merge moyen
- 19 h 57 min
- PR mergées (30 j)
- 630
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de python/cpython
-
stdlib type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour
-
extension-modules stdlib topic-XML type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
python/cpython#161807 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
stdlib type-feature
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
python/cpython#161788 · 7 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
extension-modules topic-IO type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour
-
platform: import _wmi on first usePeut-être à nouveau libre Une pull request pour cette issue a été fermée sans être fusionnée. OuverteOS-windows performance stdlib type-feature
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
python/cpython#161513 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de python/cpython
Issues similaires
-
Email validation accepts a trailing newlinePeut-être pris @marcello-pichini l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour
-
Contributing instructionsOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
dbt-labs/spark-utils#51 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 1 jour
-
bug frontend
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
vendrabuck/HERD#1419 ·
Les mainteneurs répondent en général sous 1 jour