Python中<code>from module import *</code>与<code>import module</code>区别及不良实践原因
Python两种导入语句的差异与
from module import *的弊端 两种导入语句的核心差异:
使用from module import *导入后,可直接调用目标模块内的类、函数等对象,就像这些对象定义在当前导入文件中一样;使用import module导入时,调用模块内对象需要在名称前添加module.前缀。
from module import *在多数生产开发场景下被认定为不良实践,核心原因有以下几点:
- 命名空间污染与冲突风险
如果同时导入多个模块,不同模块的同名函数、类、变量会互相覆盖,且不会触发任何报错提示。例如同时执行from csv import *和from json import *,两个模块都存在同名的读取方法,最终调用的逻辑完全由导入顺序决定,这类隐性bug的排查成本极高。 - 代码可读性大幅降低
阅读代码时,无法直接判断当前调用的对象是当前文件原生定义,还是来自某个导入的模块,需要额外翻找头部的导入语句才能确认,大幅提升后续的代码维护成本。而import module的写法可以通过module.func()的格式直观标识对象来源,不存在这个问题。 - 违反官方编码规范
Python官方的PEP 8编码规范明确要求生产环境代码尽量避免使用from module import *的写法,仅允许两种例外场景:一是交互式编程场景下为了减少输入成本使用,二是模块通过__all__属性明确声明了导出的公开接口列表。 - 依赖升级风险高
如果依赖的第三方模块后续版本迭代中删除、重命名了某个对象,使用import *的代码报错后无法快速定位缺失对象的来源,而明确导入或者带前缀调用的写法可以直接定位到对应的模块,排查效率更高。
内容的提问来源于stack exchange,提问作者Dadá
相关产品推荐
相关产品推荐

