[英]Importing function from another .py file imports more than just that function?
為了說明我遇到的問題,請考慮以下內容。 我有兩個 .py 文件,一個名為main.py
,另一個名為mymodule.py
。 它們都在同一個目錄中。
main.py
的內容:
from mymodule import myfunction
myfunction()
mymodule.py
的內容:
def myfunction():
for number in range(0,10):
print(number)
print("Hi")
我的印象是導入一個函數只會導入那個函數。 但是,當我運行main.py
時,這就是我得到的:
Hi
0
1
2
3
4
5
6
7
8
9
為什么調用print("Hi")
? 它不是我導入的功能的一部分!
我的印象是導入一個函數只會導入那個函數。
似乎對 from-import 的實際作用存在不正確的假設。
第一次導入模塊時,導入語句將執行整個模塊,包括在全局范圍 (docs ) 進行的print
調用。 無論mymodule
是使用import mymodule
之類的語句還是使用from mymodule import myfunction
類的語句首先導入的,這都是正確的。
同一模塊的后續導入將重新使用緩存在sys.modules
中的現有模塊,這可能是您誤會整個模塊未執行的方式。
有一種通用模式可以避免模塊導入執行全局級代碼。 通常,您會發現不打算在導入時執行的代碼位於條件內,如下所示:
def myfunction():
for number in range(0,10):
print(number)
if __name__ == "__main__":
print("Hi")
為了從模塊中導入一些東西,Python 需要首先加載這個模塊。 在那一刻,模塊級別的所有代碼都被執行。
根據文檔:
一個模塊可以包含可執行語句以及函數定義。 這些語句旨在初始化模塊。 它們僅在 import 語句中第一次遇到模塊名稱時執行。
這個問題似乎與這個問題重復。
簡而言之:導入模塊時會調用 python 文件的所有代碼。 既不是函數也不是類的東西通常放在這里調用的主函數中:
if __name__ == "__main__":
# stuff only to run when not called via 'import' here
main()
請考慮關閉此線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.