跳轉到內容

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.")

連結

建立模組

[編輯 | 編輯原始碼]

從檔案

[編輯 | 編輯原始碼]

建立模組的最簡單方法是在 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 命令。

假設我們還有兩個名為 Object2Object3 的物件,我們希望使用一個命令載入所有三個物件。然後,我們建立一個名為 mymod 的目錄,並將三個名為 Object1.pyObject2.pyObject3.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)

連結

擴充套件模組路徑

[編輯 | 編輯原始碼]

當請求匯入時,將在模組路徑中的目錄(和 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 的定義,則第二行確保第三行實際上起作用。

連結

模組名稱

[編輯 | 編輯原始碼]

模組名稱似乎僅限於字母數字字元和下劃線;不能使用連字元。雖然可以建立 my-module.py 並執行,但匯入 my-module 會失敗。模組的名稱是模組檔名的名稱,減去 .py 字尾。

模組名稱區分大小寫。如果模組檔名為 MyModule.py,則執行“import mymodule”會失敗,而“import MyModule”則可以正常工作。

PEP 0008 建議模組名稱全部小寫,可以使用下劃線。

標準庫中模組名稱的示例包括 math、sys、io、re、urllib、difflib 和 unicodedata。

連結

內建模組

[編輯 | 編輯原始碼]

模組是內建的並不意味著它是標準庫的一部分。例如,re 不是內建模組,而是用 Python 編寫的模組。相比之下,_sre 是一個內建模組。

獲取內建模組名稱列表

print(sys.builtin_module_names)
print("_sre" in sys.builtin_module_names) # True
print("math" in sys.builtin_module_names) # True

連結

[編輯 | 編輯原始碼]
華夏公益教科書