Python import 和 from … import 的主要区别

在 Python 中,importfrom ... import 是用于导入模块或模块中特定对象的语句,二者在功能上密切相关,但用法和语义有细微区别。以下是它们的主要区别和详细说明,结合简洁的示例和上下文(如 REST API、Cron、ChromeDriver 等)。


一、基本概念

  • import:基础导入语句,用于加载整个模块或其部分内容到当前命名空间。
  • from ... importimport 的一种扩展形式,允许从指定模块中导入特定的对象(函数、类、变量等),或从模块的子模块导入。

二、主要区别

  1. 语法和使用场景
  • import
    • 直接导入整个模块或模块别名。
    • 语法:import module_name [as alias]
    • 示例:import requests 导入整个 requests 模块。
  • from ... import
    • 从模块中导入特定的对象(如函数、类、变量)或子模块。
    • 语法:from module_name import object_name [as alias]
    • 示例:from requests import get 仅导入 requests 模块中的 get 函数。
  1. 命名空间控制
  • import:将整个模块引入当前命名空间,访问时需通过 module_name.object(如 requests.get())。
  • from ... import:将特定对象直接引入当前命名空间,访问时无需模块名前缀(如直接调用 get()),但可能导致命名冲突。
  1. 灵活性
  • import:适合需要使用模块中多个功能的情况,代码更清晰,避免命名冲突。
  • from ... import:适合只使用模块的少量功能,减少代码冗余,但需注意命名空间污染。
  1. 性能影响
  • 两者在性能上几乎无差异,Python 在导入时只加载模块一次(存储在 sys.modules 中),后续导入不会重复加载。
  • 例如,import requestsfrom requests import get 都会加载整个 requests 模块。

三、代码示例

1. 使用 import

import requests

# 调用 REST API
response = requests.get('https://api.example.com/data')
print(response.status_code)
  • 导入整个 requests 模块,调用时使用 requests.get

2. 使用 from ... import

from requests import get

# 直接调用 get 函数
response = get('https://api.example.com/data')
print(response.status_code)
  • 只导入 get 函数,调用时无需前缀 requests.,但可能与其他模块的 get 函数冲突。

3. 结合 ChromeDriver 和 Selenium

# 使用 import
import selenium.webdriver

driver = selenium.webdriver.Chrome()
driver.get('https://www.example.com')

# 使用 from ... import
from selenium.webdriver import Chrome

driver = Chrome()  # 更简洁
driver.get('https://www.example.com')
  • import selenium.webdriver 导入整个模块,适合使用多个 WebDriver 类。
  • from selenium.webdriver import Chrome 只导入 Chrome 类,适合单一用途。

4. 结合 tqdm 进度条

# 使用 import
import tqdm

for i in tqdm.tqdm(range(100)):
    pass

# 使用 from ... import
from tqdm import tqdm

for i in tqdm(range(100)):
    pass
  • 两者效果相同,但 from tqdm import tqdm 更简洁。

5. 结合 Cron 脚本

假设一个定时任务脚本调用 REST API:

# 使用 import
import requests
import time

for _ in range(5):
    response = requests.get('http://localhost:3000/users')
    print(response.json())
    time.sleep(60)

# 使用 from ... import
from requests import get
from time import sleep

for _ in range(5):
    response = get('http://localhost:3000/users')
    print(response.json())
    sleep(60)
  • from ... import 使代码更简洁,但需确保 getsleep 名称不与其他模块冲突。

四、注意事项

  1. 命名冲突
  • 使用 from ... import 时,导入的对象可能覆盖当前命名空间中的同名对象。例如:
    python from datetime import datetime from time import time print(time()) # 调用 time.time()
    如果误导入其他模块的 time,可能导致错误。推荐使用 import time 并以 time.time() 调用。
  1. 可读性
  • import module_name 更清晰,适合团队协作或大型项目。
  • from module_name import object_name 适合小型脚本或明确只需要特定对象。
  1. 模块别名
  • 两者都支持 as 别名,减少代码长度:
    python import numpy as np from pandas import DataFrame as df
  1. 调试(类似 console.log)
  • 使用 print 调试导入是否成功:
    python import requests print(requests.__version__) # 检查模块版本
  1. 性能优化
  • 避免在循环中重复导入,Python 会自动缓存模块。
  • 如果只需要模块的一部分,from ... import 更直观,但不会减少内存占用。

五、总结

  • import 适合导入整个模块,保持命名空间清晰,推荐在复杂项目中使用。
  • from ... import 适合导入特定对象,简化代码,但需注意命名冲突。
  • 在 REST API、ChromeDriver 或 Cron 任务中,两者均可使用,选择取决于代码风格和需求。
  • 优先使用 import 保持可维护性,在小型脚本中可使用 from ... import 提高简洁性。

如果需要更具体的场景(如结合 Traefik、REST API 或 ChromeDriver 的复杂导入示例),请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注