[英]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 代碼中發生的簡化事件序列:
__init__.py
開始運行
__main__
模塊被添加到sys.modules
import module1
module1.py
開始加載module1.py
module1
模塊被添加到sys.modules
import module2
開始加載module2.py
module2
模塊被添加到sys.modules
module2.function2
被創建並添加到module2.__dict__
function2
引用module1
中的名稱這一事實不會以任何方式影響函數對象的創建module2
被完全加載並且執行返回到module1
module1.function1
和module1.function3
被創建並添加到module1.__dict__
AttributeError
和NameError
。module1
被完全加載並且執行返回到__main__
module1.function
運行成功,因為它引用的所有名稱都是可解析的。 如您所見,在這個特定的導入序列中沒有循環導入問題,因為module1
和module2
不會嘗試調用彼此的函數。 當前的導入系統允許在調用函數之前加載兩個模塊。
您提到的帖子是 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.