在 Python 编程领域,当模块尝试相互导入时,可能会出现循环依赖。了解此类导入的行为对于避免潜在的陷阱至关重要。
当两个模块(例如 foo 和 bar)使用 import foo 和 import bar 相互导入时,导入将无缝成功,因为两个模块都已完全加载并且可以互相引用。
但是,使用 from 导入时会出现问题,例如 from foo import abc 和 from bar import xyz。在这些场景中,每个模块都需要导入另一个模块才能继续。这种循环依赖会导致导入错误。
为了说明这一点,请考虑以下代码:
# foo.py from bar import xyz def abc(): print(xyz.__name__) # bar.py from foo import abc def xyz(): print(abc.__name__)
此代码将触发 ImportError,因为 foo 需要导入 bar 才能执行from import 语句,但 bar 也需要先导入 foo。
为了有效处理循环导入,有几种解决方案存在:
模块顶部;没有来自;仅限 Python 2:
# foo.py import bar def abc(): print(bar.xyz.__name__) # bar.py import foo def xyz(): print(foo.abc.__name__)
模块顶部;从好的;相对还可以;仅适用于 Python 3:
# foo.py from . import bar def abc(): print(bar.xyz.__name__) # bar.py from . import foo def xyz(): print(abc.__name__)
模块顶部;没有来自;无亲属:
# foo.py import lib.bar def abc(): print(lib.bar.xyz.__name__) # bar.py import lib.foo def xyz(): print(lib.foo.abc.__name__)
模块底部;导入属性,而不是模块;从好的开始:
# foo.py def abc(): print(xyz.__name__) from .bar import xyz # bar.py def xyz(): print(abc.__name__) from .foo import abc
函数顶部;来自okay:
# foo.py def abc(): from . import bar print(bar.xyz.__name__) # bar.py def xyz(): from . import foo print(foo.abc.__name__)
但是,原始文章中提供的示例中没有讨论明星导入。
以上是如何避免和解决Python中的循环导入?的详细内容。更多信息请关注PHP中文网其他相关文章!