Incomplete stack traces when throwing into a generator chain that ends in a custom generator
還沒有人認領這個 Issue。
- 主要語言
- Python
- 星號
- 77.2k
- 分支
- 36k
- PR 合併指標
- PR 指標待擷取
描述
Bug report
Bug description:
bpo-29590 identified an issue where only the head of a chain of generators was included in stack-traces when processing a thrown-in exception. I think this issue still exists but only in the case where the head of a chain of generators is a custom generator.
Consider the following example in which a custom generator's throw() method does not see its predecessor in the yield from chain (the g() generator), but the builtin in generator does:
$ cat test.py
import sys
class UserGen:
def throw(self, *args):
print("Traceback from UserGen:")
f = sys._getframe()
while f:
print(f)
f = f.f_back
def __iter__(self):
return self
def __next__(self):
return 42
def real_gen():
yield 43
def g(target):
yield from target
gg = g(UserGen())
gg.send(None)
gg.throw(RuntimeError)
print()
gg = g(real_gen())
gg.send(None)
gg.throw(RuntimeError)
$ python3 test.py
Traceback from UserGen:
<frame at 0x10273e230, file 'test.py', line 8, code throw>
<frame at 0x10270d440, file 'test.py', line 26, code <module>>
Traceback (most recent call last):
File "test.py", line 32, in <module>
gg.throw(RuntimeError)
File "test.py", line 22, in g
yield from target
File "test.py", line 18, in real_gen
yield 43
RuntimeError
The fix for bpo-29590 is in #19896 and appears to specifically only link frames together for chains of builtin generators only. I suspect this was just an oversight rather than a deliberate choice though.
I attach a proposed fix in a PR.
CPython versions tested on:
CPython main branch
Operating systems tested on:
No response
Linked PRs
- gh-126092
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
首先執行 test.py 重現程式,並比較 custom-generator 與 real_gen 的堆疊追蹤。檢視 gh-126092 中提出的修正,並確認完成後的行為包含 custom-generator 鏈中的前置元素,同時不會讓 builtin-generator 情況發生回歸。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- python
- 領域
- backend
- Issue 類型
- 缺陷
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 停滯
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100