Python使用isinstance判断导入的Register类实例时出现导入报错如何解决
问题根因
你遇到的报错来自两个关联问题:
- 直接导入
Register时的报错是循环导入导致:sample.dziennik模块中也导入了你当前__init__.py内的内容,两个模块互相等待对方初始化完成,卡在半初始化状态无法导出类。 - 用
*导入时报NameError,要么是dziennik.py中没有声明包含Register的__all__导出列表,要么是循环导入导致模块初始化未完成,Register还没被定义就被提前导入了。
可行解决方案
以下方案按实现成本从低到高排序:
方案1:使用延迟导入(最省事,无需改代码结构)
不要在文件顶部导入Register,把导入语句挪到实际用到Register的函数内部,把导入时机从模块初始化阶段推迟到函数第一次被调用的阶段,此时两个模块都已经完成初始化,不会触发循环导入问题。
修改后的代码如下:
# 删掉文件顶部的 from sample.dziennik import * 语句 def checkIfGoodValues(id,firstName,lastName,register,subjects,warnings): # 导入语句移到函数内部 from sample.dziennik import Register if type(id) != int: return False if type(firstName) != str: return False if type(lastName) != str: return False # 这里可以直接返回判断结果,无需冗余的if else return isinstance(register, Register)
方案2:导入完整模块而非单独类
如果导入整个sample.dziennik模块不会触发循环导入报错,可以直接导入模块,用模块名.类的形式做类型判断:
# 顶部导入整个模块 import sample.dziennik as dziennik def checkIfGoodValues(id,firstName,lastName,register,subjects,warnings): if type(id) != int: return False if type(firstName) != str: return False if type(lastName) != str: return False return isinstance(register, dziennik.Register)
方案3:拆分循环依赖(适合长期维护的项目)
把两个模块互相依赖的公共逻辑抽离到第三个独立模块中,比如把Register类单独放到sample/models.py文件中,之后dziennik.py和当前的__init__.py都从sample/models导入Register,从根源上消除循环导入的可能。
内容的提问来源于stack exchange,提问作者crazyfrog
相关产品推荐
相关产品推荐

