Python中误将类型提示冒号写为等号引发的对象不可调用异常解析
Python 3.12.3中多重赋值覆盖类引发的异常解析
问题背景
在Python 3.12.3环境下,一段将类型提示冒号误写为等号的代码长期正常运行,直到后续模块执行正确代码时才触发报错:
错误代码(可正常执行):
files= VGF.chronological_filenames_iter = VGF.chronological_filenames_iter(ti=ti, fname=name_pattern)
后续模块的正确代码(触发异常):
files: VGF.chronological_filenames_iter = VGF.chronological_filenames_iter(ti=ti, fname=another_name_pattern)
抛出的异常:
TypeError: 'chronological_filenames_iter' object is not callable
注:VGF模块及其中的chronological_filenames_iter类本身无问题。
行为解析
1. 错误代码的实际执行逻辑
Python的链式多重赋值a = b = c会先计算右侧表达式c的值,再将该值同时赋值给b和a。这段错误代码中:
- 首先调用
VGF.chronological_filenames_iter(ti=ti, fname=name_pattern)创建了一个类实例 - 随后将这个实例同时赋值给
VGF.chronological_filenames_iter(直接覆盖了原本的类引用)和files
简言之,你把模块里的类本身替换成了它的一个实例。
2. 错误代码未触发报错的原因
这段代码执行后,files确实拿到了预期的实例,且当前模块没有再去调用VGF.chronological_filenames_iter创建新实例的操作,因此表面功能正常,错误被完全隐藏。
3. 后续模块报错的本质
当后续模块尝试通过VGF.chronological_filenames_iter()创建新实例时,该名称对应的已经不是类,而是之前创建的那个实例。由于这个实例没有定义__call__方法(类本身无问题,说明未实现该方法),实例本身不可调用,于是抛出TypeError。
内容的提问来源于stack exchange,提问作者Frank E
相关产品推荐
相关产品推荐

