首页 > 后端开发 > Python教程 > 如何避免和解决Python中的循环导入?

如何避免和解决Python中的循环导入?

Barbara Streisand
发布: 2024-12-27 21:05:10
原创
566 人浏览过

How Can Circular Imports in Python Be Avoided and Resolved?

Python 中的循环导入:陷阱和解决方案

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板