修改类的__getattr__后Python控制台任意操作触发两次调用故障排查
问题根因
该现象不属于Python原生语法bug,完全由PyCharm内嵌IPython控制台的内置检测逻辑导致:
- PyCharm的交互式控制台为了实现输出美化、变量自动补全、对象状态实时监测功能,每次执行完任意代码指令后,都会自动扫描当前作用域内的所有用户自定义对象,尝试访问
__len__属性判断对象是否为可展示长度的容器类对象 - 你的
Foo类没有显式定义__len__方法,访问不存在的__len__属性时自然会触发兜底方法__getattr__的执行 - 两次触发的原因是PyCharm内嵌的IPython有两个独立模块会分别执行一次上述检测:第一个是输出渲染模块,第二个是调试面板的变量状态同步模块,两个模块各自对作用域内的
foo实例做一次__len__属性探测,因此会打印两次haha和__len__
验证方案
你可以通过两个操作验证上述结论:
- 脱离PyCharm环境,直接在系统原生Python终端运行对应代码,输入任意指令后不会出现额外的
haha打印 - 给
Foo类显式添加__len__方法:
class Foo: def __len__(self): return 0 def __getattr__(self, item): print('haha') print(item)
修改完成后再在PyCharm控制台测试,不会再触发__getattr__的调用,因为__len__属性已存在,不需要走__getattr__的兜底逻辑
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

