簡體   English   中英

從另一個 .py 文件導入函數不僅僅導入該函數?

[英]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.

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