Python 中 "from...import" 语句有什么用?

2025年1月12日 | 阅读 4 分钟

一个有用的功能是 `from...import` 语句,它允许您仅将模块中的属性或函数导入到当前的命名空间中。它提供了一种更准确的方法来控制添加到代码中的内容,从而保持代码的效率和整洁。

基本语法

您可以使用 `from...import` 语句将单个属性(函数、类或变量)直接导入到当前的命名空间中。基本语法是:

语法

1. 基本导入(import X)

  • 当您使用 `import X` 时,Python 会导入整个模块 X,并在您的当前命名空间中建立一个指向它的引用。
  • 要访问 X 中的属性或方法,必须使用完整的模块路径,例如 `name` 或 `X.attribute`。

2. 选择性导入(from X import ...)

  • 您可以使用 `from X import...` 命令将特定的属性直接导入到您的命名空间中。
  • 这意味着可以使用一个简单的(未限定的)名称来引用模块 X 中声明的对象。
  • 但是,`X.name` 将不起作用,因为模块 X 本身并未在您的命名空间中声明。

示例:使用 datetime 模块

代码

输出

2024-06-04 21:44:25.887277
  • 在此示例中,我们仅从 datetime 模块导入 datetime 类。
  • 现在我们可以直接使用 `datetime.now()`,而无需指定完整的模块路径。

最佳实践

何时使用 from ... import

  • 您想避免反复输入模块名。
  • 您在代码中多次引用模块的某个成员。

何时使用 import

  • 您需要使用同一个模块的多个成员。

请记住,选择 `import` 还是 `from ... import` 取决于您的具体需求和编码风格。两者在 Python 开发中都有其用武之地。

选择性导入的优势

1. 清晰高效

通过仅导入必要的组件,您可以防止不必要的属性弄乱您的命名空间,并保持代码的整洁。

2. 代码更短

您可以直接使用未限定的名称,而无需模块前缀。

示例 1:导入单个属性

假设我们想使用 math 模块中的 sqrt 函数。

代码

输出

Square root of 25: 5.0

在此示例中,我们仅导入 sqrt 函数,使其可以在没有 `math.` 前缀的情况下访问。

示例 2:导入多个属性

假设我们需要 math 模块中的 sin 和 cos 函数。

代码

输出

sin(30°): -0.99, cos(30°): 0.15

在这里,我们导入 sin 和 cos 函数以进行三角计算。

从您的模块导入自定义函数

假设您有一个名为 my_utils.py 的自定义模块,其中有一个名为 calculate_average 的函数。您可以如下导入:

代码

输出

Average score: 87.60

在这里,我们选择性地导入了我们用于计算平均值的自定义函数。

从模块导入类

如果您有一个包含类定义的模块,您可以直接导入该类。

语法

高级技术

1. 绝对导入与相对导入

  • 使用完整路径导入模块称为绝对导入(例如,`import math`)。
  • 包可以使用相对导入来引用同一包内的其他模块(例如,`from . import my_module`)。

2. 命名空间包

  • 命名空间包允许将一个包分割到多个目录中。
  • 对于具有模块化组织的大型项目非常有用。

3. 动态导入

  • 在运行时根据条件(例如,用户输入或配置)导入模块。
  • 通过 `importlib` 实现。

4. 资源导入

  • 从您的包中加载数据文件(例如,图标、配置文件)。
  • 使用 `importlib.resources`。

5. 自定义导入行为

  • 使用钩子、查找器和加载器修改 Python 的导入系统行为。
  • 对于创建自定义导入机制很有用。

请记住,Python 拥有灵活的导入系统,可以帮助您开发更有效、更易于维护的代码。

Python 的 `from...import` 语句允许您仅导入模块中的函数或对象。当您想避免再次键入模块名时,它非常有用。例如,使用 `from urllib import request` 来直接访问所需的函数。导入 `urllib.request` 会实现相同的功能,但需要使用完整的模块路径。给导入的函数起别名是另一种防止与内置名称冲突的方法。总之,`from...import` 命令通过允许精确导入、提高可读性并避免命名冲突来简化代码。