Python 程式設計/模組
模組是一種結構化程式和建立可重用庫的方法。模組通常儲存在單獨的 .py 檔案中並對應於它。標準庫中提供了許多模組。您可以建立自己的模組。Python 在當前目錄和其他位置搜尋模組;可以透過擴充套件 PYTHONPATH 環境變數和其他方式來擴充套件模組搜尋位置列表。
要使用模組提供的函式和類,您必須匯入模組
import math
print(math.sqrt(10))
上面的程式碼匯入了 math 標準模組,使該模組中的所有函式都以模組名稱為名稱空間。它匯入所有函式和所有類(如果有)。
您可以以不同的名稱匯入模組
import math as Mathematics
print(Mathematics.sqrt(10))
您可以匯入單個函式,使其無需模組名稱名稱空間即可使用
from math import sqrt
print(sqrt(10))
您可以匯入單個函式並以不同的名稱使用它
from math import cos as cosine
print(cosine(10))
您可以在一行程式碼中匯入多個模組
import os, sys, re
您可以在函式定義中儘可能晚地進行匯入
def sqrtTen():
import math
print(math.sqrt(10))
此類匯入僅在呼叫函式時才會發生。
您可以使用星號符號匯入模組中的所有函式,而無需模組名稱空間
from math import *
print(sqrt(10))
但是,如果您在函式內部執行此操作,您將在 Python 2 中收到警告,而在 Python 3 中收到錯誤
def sqrtTen():
from math import *
print(sqrt(10))
您可以為未找到的模組設定防護
try:
import custommodule
except ImportError:
pass
模組可以是不同型別的事物
- Python 檔案
- 共享物件(在 Unix 和 Linux 下)帶有 .so 字尾
- DLL(在 Windows 下)帶有 .pyd 字尾
- 目錄
模組按照發現順序載入,這由 sys.path 控制。當前目錄始終位於路徑中。
目錄應包含一個名為 __init__.py 的檔案,該檔案可能應包含目錄中的其他檔案。
在另一部分中介紹了建立與 Python 互動的 DLL。
您可以檢查模組是否已匯入,如下所示
if "re" in sys.modules:
print("Regular expression module is ready for use.")
連結
- 28.1. sys # sys.modules,docs.python.org
建立模組的最簡單方法是在 PYTHONPATH 變數識別的目錄中或(更簡單)在您工作目錄中建立一個名為 mymod.py 的檔案。如果您有以下檔案 mymod.py
class Object1:
def __init__(self):
self.name = 'object 1'
您現在可以匯入此“模組”並建立 Object1 物件的例項。
import mymod
myobject = mymod.Object1()
from mymod import *
myobject = Object1()
對於大型專案,將所有類都儲存在一個檔案中並不切實際。通常,將所有檔案儲存在目錄中並使用一個命令載入所有檔案更容易。每個目錄都需要有一個 __init__.py 檔案,其中包含在載入目錄時執行的 python 命令。
假設我們還有兩個名為 Object2 和 Object3 的物件,我們希望使用一個命令載入所有三個物件。然後我們建立一個名為 mymod 的目錄,並在其中儲存三個名為 Object1.py、Object2.py 和 Object3.py 的檔案。然後這些檔案將包含每個檔案一個物件,但這並非必需(儘管它可以提高畫質晰度)。然後,我們將編寫以下 __init__.py 檔案
from Object1 import *
from Object2 import *
from Object3 import *
__all__ = ["Object1", "Object2", "Object3"]
前三個命令告訴 python 當有人載入模組時該怎麼做。定義 __all__ 的最後一條語句告訴 python 當有人執行 from mymod import * 時該怎麼做。通常,我們希望在模組的其他部分中使用模組的部分內容,例如,我們希望在 Object2 中使用 Object1。我們可以使用 from . import * 命令輕鬆做到這一點,如下面的檔案 Object2.py 所示
from . import *
class Object2:
def __init__(self):
self.name = 'object 2'
self.otherObject = Object1()
現在我們可以啟動 python 並像上一節一樣匯入 mymod。
為了使程式既可以作為獨立程式從命令列呼叫,也可以作為模組使用,建議您將所有程式碼放在函式和方法中,指定一個函式作為主函式,並在 __name__ 內建等於 '__main__' 時呼叫主函式。這樣做的目的是確保您放在主函式中的程式碼在將程式匯入為模組時不會被呼叫;如果程式碼放在函式和方法之外,則程式碼會在匯入時被呼叫。
您的程式(儲存在 mymodule.py 中)可以如下所示
def reusable_function(x, y):
return x + y
def main():
pass
# Any code you like
if __name__ == '__main__':
main()
上面程式的用途如下所示
from mymodule import reusable_function
my_result = reusable_function(4, 5)
連結
- Python 教程 - 6.1.1. 將模組作為指令碼執行,python.org
當請求匯入時,會在模組路徑中的目錄(和 zip 檔案?)中搜索模組,可以透過 sys.path 訪問,sys.path 是一個 Python 列表。模組路徑可以擴充套件如下
import sys
sys.path.append("/My/Path/To/Module/Directory")
from ModuleFileName import my_function
上面,如果 ModuleFileName.py 位於 /My/Path/To/Module/Directory 並且包含 my_function 的定義,則第二行確保第三行實際有效。
連結
- 模組搜尋路徑 在 Python 文件中
模組名稱似乎僅限於字母數字字元和下劃線;不能使用連字元。雖然可以建立和執行 my-module.py,但匯入 my-module 會失敗。模組的名稱是模組檔名減去 .py 字尾。
模組名稱區分大小寫。如果模組檔名為 MyModule.py,則執行“import mymodule”會失敗,而“import MyModule”則正常。
PEP 0008 建議模組名稱全部小寫,並可能使用下劃線。
標準庫中模組名稱的示例包括 math、sys、io、re、urllib、difflib 和 unicodedata。
連結
- 包和模組名稱 在 PEP 0008 -- Python 程式碼風格指南中
- Python 標準庫 在 docs.python.org 上
對於模組來說,內建並不等同於成為標準庫的一部分。例如,re 不是內建模組,而是用 Python 編寫的模組。相反,_sre 是一個內建模組。
獲取內建模組名稱列表
print(sys.builtin_module_names)
print("_sre" in sys.builtin_module_names) # True
print("math" in sys.builtin_module_names) # True
連結
- 28.1. sys # sys.builtin_module_names,docs.python.org
- Python 標準庫,docs.python.org
- 6. 模組,Python 教程,python.org
- Python 模組索引,python.org
- 31. 匯入模組,python.org
- 安裝 Python 模組,python.org
- Python 中的習慣用法和反習慣用法,python.org
- Python:為什麼應該禁止 'from <module> import *'?,stackoverflow.com
- 匯入模組時的錯誤處理, stackoverflow.com