跳转到内容

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

链接

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