SequenceMatcher.get_grouped_opcodes() changes the result of later get_opcodes() calls
維護者通常 1 天內回覆
還沒有人認領這個 Issue。
評估
研究方向
從回報的 SequenceMatcher.get_opcodes() 和 get_grouped_opcodes() 行為著手,使用 issue 中的重現程式碼比較分組前後的結果。完成標準是:呼叫 get_grouped_opcodes() 不再改變之後傳回的完整 opcodes,且使用較大的 n 分組時能保留預期的上下文。
由索引模型根據 Issue 內容生成。
描述
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
- 主要語言
- Python
- 星號
- 78.2k
- 分支
- 36.6k
- 平均合併
- 19 小時 57 分鐘
- 30 天內合併 PR
- 630
環境準備
在瀏覽器裡用你自己的 GitHub 帳號啟動這個專案的開發容器。
- 沒有 Dockerfile 或 Docker Compose 檔案
- 有 Pull Request 範本
- 閱讀貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
python/cpython 的其他 Issue
-
stdlib type-bug
難度 2/5 1-3 小時 新手友好度 75/100
維護者通常 1 天內回覆
-
extension-modules stdlib topic-XML type-bug
難度 2/5 1-3 小時 新手友好度 76/100
python/cpython#161807 · 1 則留言 ·
維護者通常 1 天內回覆
-
stdlib type-feature
難度 2/5 1-3 小時 新手友好度 78/100
python/cpython#161788 · 7 則留言 ·
維護者通常 1 天內回覆
-
extension-modules topic-IO type-bug
難度 2/5 1-3 小時 新手友好度 75/100
維護者通常 1 天內回覆
-
platform: import _wmi on first use可能重新可做 關聯的 PR 已關閉且未合併。 未關閉OS-windows performance stdlib type-feature
難度 2/5 1-3 小時 新手友好度 76/100
python/cpython#161513 · 1 則留言 ·
維護者通常 1 天內回覆
相似的 Issue
-
Email validation accepts a trailing newline可能已有人在做 @marcello-pichini 今天認領。 未關閉
難度 2/5 1-3 小時 新手友好度 78/100
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 76/100
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 72/100
dbt-labs/spark-utils#51 ·
-
難度 2/5 1-3 小時 新手友好度 85/100
維護者通常 1 天內回覆
-
bug frontend
難度 2/5 1-3 小時 新手友好度 88/100
vendrabuck/HERD#1419 ·
維護者通常 1 天內回覆