Python : 改进的模块importlib

博客介绍了importlib模块的更新内容,包括引入importlib.abc.ResourceReader ABC支持从包中加载资源;若模块缺少规格描述,importlib.reload()会引发ModuleNotFoundError;指定父模块非包时,importlib.find_spec()引发ModuleNotFoundError;新增importlib.source_hash()用于计算源哈希值。

引入了 importlib.abc.ResourceReader ABC 以支持从包中加载资源。 另请参阅 importlib.resources。 (由 Barry Warsaw, Brett Cannon 在 bpo-32248 中贡献。)

如果模块缺少规格描述 importlib.reload() 现在会引发 ModuleNotFoundError。 (由 Garvit Khatri 在 bpo-29851 中贡献。)

如果指定的父模块不是一个包 (即缺少 path 属性) importlib.find_spec() 现在会引发 ModuleNotFoundError 而非 AttributeError。 (由 Milan Oberkirch 在 bpo-30436 中贡献。)

新的 importlib.source_hash() 可被用来计算传入源的哈希值。 基于哈希值的 .pyc 文件 会嵌入此函数所返回的值。

### Python `imp` 和 `importlib` 模块的区别及用法 #### 1. 历史背景与发展 `imp` 是早期版本中的模块,主要用于加载和导入其他模块。然而,在后续的发展过程中,Python 社区逐渐意识到该接口存在一些局限性和不易维护的问题。 为了改进这一点,自 Python 3.4 起官方推荐使用更现代化且功能更为强大的 `importlib` 来替代 `imp`[^2]。 #### 2. 功能对比 - **灵活性** - `importlib`: 提供了更高层次的抽象以及更多的控制选项,允许开发者更好地定制化自己的导入逻辑。 - **性能表现** - 对于大多数应用场景而言两者之间的差异可以忽略不计;但在某些特定情况下(比如频繁执行动态导入操作),`importlib` 可能会表现出更好的效率。 - **API 设计** - `importlib` 的 API 更加直观易懂,并遵循现代编码风格指南的要求,这有助于提高代码可读性并减少潜在错误的发生几率。 #### 3. 使用示例 ##### 使用 `importlib` ```python # 导入 importlib.util 中的相关方法 from importlib import util module_name = 'example_module' file_path = '/path/to/example_module.py' spec = util.spec_from_file_location(module_name, file_path) module = util.module_from_spec(spec) try: spec.loader.exec_module(module) except Exception as e: print(f"Failed to load module {module_name}: {e}") else: # 成功导入后调用其中的方法或属性 result = module.some_function() ``` ##### 使用 `imp` (已弃用) ```python import imp module_name = 'example_module' file_path = '/path/to/example_module.py' try: example_module = imp.load_source(module_name, file_path) except ImportError as error: print('Import failed:', str(error)) else: # 如果成功则继续处理... pass finally: del imp # 清理不再使用的引用 ``` 由于 `imp` 已被标记为过时并且在未来可能会移除支持,因此建议新项目一律采用 `importlib` 进行相关工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值