關于你不知道的 Python import 十件事
1) “import X” VS "from X import Y”
我們有 2 個文件:運行的 main.py 和導入的 helper.py。
這里有兩種主要的導入方式:
圖片
以及
圖片
兩種方法都有效,各有利弊:
在 from helper import testfunc 中,我們只需鍵入 testfunc() 就可以使用它,而在 import helper 中,我們需要鍵入 helper.testfunc()
不過,在更大、更復雜的應用程序中, from helper import testfunc
相反, import helper 不會意外覆蓋另一個名稱為 testfunc 的函數/變量,因為它是有命名空間的( helper.testfunc
2) “from X import Y“ VS ”from X import *"
from helper import testfunc 只導入 testfunc
圖片
from helper import * 導入 helper.py
圖片
雖然 from helper import *
當我們使用 from helper import *
因此,更好的做法通常是明確說明我們要導入的內容,而不是在文件中導入所有內容。
3) import 用于動態導入
圖片
這樣我們就可以使用字符串動態導入模塊。
4) sys.path 和導入內容的位置
當我們導入東西時,Python 有一個要搜索的文件夾列表。
我們可以通過打印 sys.path
圖片
當我們導入 pandas 時,Python 會嘗試在第一個文件夾 /Users/me/Documents/test
如果第一個文件夾中存在 pandas,Python 就會直接從這里導入 pandas。否則,Python 將轉到下一個文件夾 /some/other/path
如此反復,直到沒有文件夾可供 Python 搜索。當這種情況發生時,我們會得到一個 ImportError
圖片
5) 可以手動向 sys.path 添加內容
sys.path 是一個普通的字符串列表。Python 只是碰巧從 sys.path
假設我們需要從 /some/weird/path/test.py
而我們正在使用 /our/main/path/main.py
圖片
因此,我們只需在 sys.path 中添加 /some/weird/path ,這樣 Python 就會知道我們希望從 /some/weird/path
將 some/weird/path 添加到 sys.path
6) PEP8 的導入順序
PEP8 (Python Enhancement Proposal 8) 是一份說明 Python 代碼風格最佳實踐的文檔。鏈接:https://peps.python.org/pep-0008/
關于導入,最好這樣排序:
- 標準庫導入,例如 os, sys, json, re
- 相關的第三方導入,如 pandas、numpy、fastapi
- 本地庫特定導入,如 our_custom_modules
記得在每組導入之間添加一個換行符,以提高可讀性
圖片
注意: Python 并不強制這樣做
7) __all__ 和從文件導出
特殊的 __all__ 變量控制著從文件導入的內容。
我們有兩個文件:main.py 和 helper.py,main.py 從 helper.py
helper.py包含許多函數,但它有一個__all__變量。
圖片
在這里,__all__ 變量的作用是,當我們執行 from helper import 時,只有 hello 和 hi 被導出。
圖片
在這里,由于 hello.py 只導出了 hello 和 hi,因此 main.py 只導入了 hello 和 hi.
這意味著 hola 和 nihao
因此,__all__ 變量可以用來限制 Python 模塊中導出的內容,如果我們的模塊很雜亂,包含很多變量,這個變量就特別有用。
8) 在 “from X import” 過程中,不導入以 _ 開頭的變量。
我們有 2 個文件:main.py 和 helper.py,main.py 從 helper.py
圖片
在 helper.py
圖片
而當我們執行 “from helper import *” 時,
9) PYTHONPATH 環境變量
PYTHONPATH是一個環境變量,我們可以選擇是否定義它。如果我們定義了它,PYTHONPATH 會自動添加到 sys.path
在下面的示例中,我們沒有定義PYTHONPATH:
圖片
在下一個示例中,我們將PYTHONPATH 設置為 /some/funny/path
圖片
因此, /some/funny/path 會自動添加到 sys.path
如果我們想從其他路徑導入模塊,但又不想將我們的當前目錄與該位置關聯起來,這就很有用了。
10) 在導入時使用 '__name__'
'__name__' 是 Python 中的另一個特殊變量。
當我們直接運行一個文件時,__name__默認為字符串值*'__main__'*。
相反,導入文件中的 __name__ 并不是 '__main__' ,而是 Python 文件的名稱。
圖片
圖片
圖片
在這里,我們直接運行 a.py。因此,a.py 中的 '__name__' 默認為 __main__。
b.py 和 c.py 不會直接運行。相反,我們從它們中導入。因此,b.py 中的 '__name__' 只是 b, 而 c.py 中的 '__name__' 只是 c
這就是為什么我們經常在 Python 代碼中看到 if __name__ == '__main__' 這是為了確保只有在我們直接運行這個特定的 Python 文件時,這個代碼塊中的內容才會運行。