You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改类的__getattr__后Python控制台任意操作触发两次调用故障排查

问题根因

该现象不属于Python原生语法bug,完全由PyCharm内嵌IPython控制台的内置检测逻辑导致:

  • PyCharm的交互式控制台为了实现输出美化、变量自动补全、对象状态实时监测功能,每次执行完任意代码指令后,都会自动扫描当前作用域内的所有用户自定义对象,尝试访问__len__属性判断对象是否为可展示长度的容器类对象
  • 你的Foo类没有显式定义__len__方法,访问不存在的__len__属性时自然会触发兜底方法__getattr__的执行
  • 两次触发的原因是PyCharm内嵌的IPython有两个独立模块会分别执行一次上述检测:第一个是输出渲染模块,第二个是调试面板的变量状态同步模块,两个模块各自对作用域内的foo实例做一次__len__属性探测,因此会打印两次haha和__len__
验证方案

你可以通过两个操作验证上述结论:

  1. 脱离PyCharm环境,直接在系统原生Python终端运行对应代码,输入任意指令后不会出现额外的haha打印
  2. 给Foo类显式添加__len__方法:
class Foo:
    def __len__(self):
        return 0
    def __getattr__(self, item):
        print('haha')
        print(item)

修改完成后再在PyCharm控制台测试,不会再触发__getattr__的调用,因为__len__属性已存在,不需要走__getattr__的兜底逻辑

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:18:03