跳转到内容

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

链接

[编辑 | 编辑源代码]
华夏公益教科书