Python懒参数初始化执行顺序异常:类初始化时触发未预期运行的代码
异常成因
这个现象是PyCharm调试器的自动属性求值功能导致的,和代码逻辑本身无关:
- 你的基类
TsDataSetBase中labels、data、tensors都是@property装饰的计算属性,只要被访问就会触发判断:当__labels和__data为空时自动调用get_as_tensor(),也就是你打印strange的方法。同时继承的Dataset类的__len__方法内部也调用了self.labels,同样会触发该逻辑。 - PyCharm调试模式下,变量面板会自动读取实例的所有属性、特殊方法返回值展示给开发者,会主动访问上述几个计算属性以及
__len__方法,因此会多次触发get_as_tensor(),打印多遍strange。 - 断点无法生效的原因是PyCharm默认对调试器自身触发的代码求值操作,会跳过用户设置的普通断点,所以无法捕获到调用栈。
验证方法
你可以直接用非调试模式普通运行代码,实例化时只会输出so strange和end of init,不会出现多余的strange打印,即可确认是调试器导致的问题。
解决方案
- 临时规避:进入PyCharm设置
File > Settings > Build, Execution, Deployment > Debugger > Data Views,取消勾选Enable auto-expressions in variables view和Show value tooltip,关闭调试器自动属性求值即可。 - 代码层面优化:可以给懒加载逻辑加标记位,或者初始化时提前给属性赋值占位,避免调试时自动触发不必要的加载逻辑。
内容的提问来源于stack exchange,提问作者misha312
相关产品推荐
相关产品推荐

