首頁 > 後端開發 > Python教學 > 如何避免並解決Python中的循環導入?

如何避免並解決Python中的循環導入?

Barbara Streisand
發布: 2024-12-27 21:05:10
原創
619 人瀏覽過

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
    登入後複製
  • # foo.py
    def abc():
      from . import bar
      print(bar.xyz.__name__)
    
    # bar.py
    def xyz():
      from . import foo
      print(foo.abc.__name__)
    登入後複製

模組底部;導入屬性,而不是模組;從好的開始:函數頂;來自okay:

以上是如何避免並解決Python中的循環導入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板