Python中如何解决交叉引用问题?
4 回复
连 python 代码你都不格式化。。。。
在Python里处理模块间的交叉引用,最常见的就是两个文件互相import导致循环导入错误。核心思路就一个:打破这个循环。
这里有几种程序员常用的方法,直接上代码例子:
方法一:局部导入
把import语句放到函数或方法内部,而不是文件顶部。这样在模块加载时就不会立即执行。
# module_a.py
def func_a():
from module_b import func_b # 在需要的时候才导入
result = func_b()
return result + " from A"
# module_b.py
def func_b():
return "Hello from B"
方法二:重构代码,合并或提取公共部分 很多时候循环引用意味着代码结构可以优化。把两个模块都需要的东西抽到第三个文件里。
# common.py (新建的公共模块)
class SharedData:
data = "shared info"
# module_a.py
from common import SharedData
import module_b
def use_shared():
return SharedData.data
# module_b.py
from common import SharedData # 都从公共模块导入,避免互相引用
方法三:使用import语句的变体
用import module代替from module import something,或者用sys.modules。
# module_a.py
import module_b # 只导入模块本身
def func_a():
# 通过模块名访问
return module_b.func_b() + " processed by A"
# module_b.py
def func_b():
return "Data from B"
方法四:类型注解的延迟导入(Python 3.7+)
处理类类型提示时特别有用,用from __future__ import annotations或者字符串字面量。
# module_a.py
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from module_b import ClassB # 只在类型检查时导入,运行时不影响
class ClassA:
def method(self, b: 'ClassB') -> str: # 或者用字符串
return b.get_value()
总结建议:优先考虑重构代码结构,其次使用局部导入。
把 foo1.py 的中的 foo2, 改成__main__, 输出就是 True.
至于为什么, 大概是 python 对于 module 的命名问题, foo2 module 会被命名为__main__ module, 因而 foo1 import 的时候并不认为 foo2 已经被导入, 那么 foo2 会被重新导入一次, 第二次的导入的 Foo2 class 和第一次的不一样
靠 我在 s1 见到了这个帖子

