Side-effect of `ABC.__subclasshook__` / `_abc_instancecheck` ▶ `isinstance(..., Parent)` calls `__subclasscheck__` of uninvolved Child class -> RecursionError
未关闭
还没有人认领这个 Issue。
extension-modules
stdlib
type-bug
- 主要语言
- Python
- 星标
- 77.2k
- 派生
- 35.9k
- PR 合并指标
- PR 指标待抓取
描述
Bug report
Bug description:
I realized there is strange error of __subclasshook__, or possibly _abc_instancecheck which creates a side-effect that __subclasshook__ is called on a Child class that is not even queried.
What is even more strange this error only occurs when the crucial statement B is called in a AB situation, just B or BAB is fine.
# At the end of his snippet are 3 test sets, Only the first causes an error the other 2 are fine.
import sys
sys.setrecursionlimit(59)
from abc import ABC
class Base(ABC): ...
class _ParentCheck(Base):
@classmethod
def __subclasshook__(cls, subclass):
if not issubclass(subclass, Base):
return NotImplemented
if not hasattr(subclass, "f"):
return False
return True
class Parent(Base):
f: int
@classmethod
def construct(cls, foo: int):
class Child(cls, _ParentCheck):
f = foo
return Child
# Test Set 1: Error
assert issubclass(Parent.construct(1), Parent) # Statement A
assert not isinstance(lambda: None, Parent) # Statement B
# Test Set 2: OK
assert not isinstance(lambda: None, Parent) # Statement B
# Test Set 3: OK
assert not isinstance(lambda: None, Parent) # Statement B
assert issubclass(Parent.construct(1), Parent) # Statement A
assert not isinstance(lambda: None, Parent) # Statement B
CPython versions tested on:
3.14
Operating systems tested on:
Linux
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
首先在 CPython 3.14 上运行提供的复现程序,重点关注 ABC.subclasshook、_abc_instancecheck 以及 Parent 与 _ParentCheck 之间的交互。当 Test Set 1 不再引发 RecursionError,且 Test Sets 2 和 3 继续通过时,即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- compilers
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100