簡體   English   中英

循環導入 Python

[英]Circular imports Python

我讀過這篇關於 Python 中循環導入的文章 它描述了以下場景,並認為這會在運行時引發錯誤:

# module1
import module2

def function1():
    module2.function2()

def function3():
    print('Goodbye, World!')
# module2
import module1

def function2():
    print('Hello, World!')
    module1.function3()
# __init__.py
import module1

module1.function1()

但是當我運行這個(Python 3.95)時,它運行得非常好。 這篇文章很舊,它沒有指定它使用的 Python 版本。 也許支持這一點的后期 Python 有一些變化?

下面是 Python 3 代碼中發生的簡化事件序列:

  1. __init__.py開始運行
  2. import module1 module1.py開始加載module1.py
    • 一個空的module1模塊被添加到sys.modules
  3. import module2開始加載module2.py
    • 一個空的module2模塊被添加到sys.modules
  4. module2.function2被創建並添加到module2.__dict__
    • function2引用module1中的名稱這一事實不會以任何方式影響函數對象的創建
  5. module2被完全加載並且執行返回到module1
  6. module1.function1module1.function3被創建並添加到module1.__dict__
    • 同樣,函數引用的名稱無關緊要,因為它們沒有被調用。 如果需要,可以在運行時引發AttributeErrorNameError
  7. module1被完全加載並且執行返回到__main__
  8. module1.function運行成功,因為它引用的所有名稱都是可解析的。

如您所見,在這個特定的導入序列中沒有循環導入問題,因為module1module2不會嘗試調用彼此的函數。 當前的導入系統允許在調用函數之前加載兩個模塊。

您提到的帖子是 2017 年的,並且必須使用 3.0 之前的 python 版本。 在以下引用中的鏈接中找到了一個提示,它鏈接到 python-2.x 文檔:

這種方法與 Python 語法並不矛盾,正如Python 文檔所說:“習慣上但不需要將所有導入語句放在模塊(或腳本,就此而言)的開頭”。

順便說一下,后面的段落有點誤導:

Python 文檔還說,建議使用import X ,而不是其他語句,例如from module import *from module import a,b,c

雖然肯定不鼓勵使用星號導入from module import a,b,c但通常非常鼓勵from module import a,b,c形式的特定名稱導入,但很少有例外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM