Python中为何部分模块用from xx import *导入,部分直接import导入?
Python两类模块导入写法的区别、适用场景与差异原因
核心语法区别
from 模块名 import *:属于命名空间注入式导入,会把模块内所有非下划线开头的公开成员(类、函数、常量)直接拉到当前代码的全局命名空间里,后续调用这些成员不需要加模块前缀。比如导入tkinter后可以直接写Button()、Tk(),不用补前缀。import 模块名:属于模块级导入,只会把模块对象本身导入当前命名空间,模块下的所有成员都归属在模块独立的命名空间下,调用必须带模块名前缀。比如导入time后,休眠方法必须写time.sleep(),直接写sleep()会报名称错误。
各自适用场景
适合用from xxx import *的场景
这类写法最典型的就是tkinter这类GUI库,适用逻辑很直接:
- 开发GUI时需要高频调用大量组件、布局常量,比如
Label、Entry、LEFT、CENTER、END这类名字,如果每处都加tkinter.前缀,代码会充斥大量重复前缀,冗余度极高,写起来效率很低。 - tkinter本身做过API命名约束,公开接口的命名辨识度高,不会和Python内置函数、其他通用库的常用命名冲突,星号导入的命名污染风险很低。
- 注意这种写法基本只用于快速写demo、小型测试脚本,中大型正式项目哪怕用tkinter,也更推荐用
import tkinter as tk的别名导入写法,兼顾简洁和可维护性。
适合用常规import xxx的场景
time、os、sys这类通用标准库基本都用这种写法:
- 这类工具库的API命名非常通用,比如time下的
sleep、os下的open,如果用星号导入,会直接覆盖Python内置的同名函数,很容易出很难排查的隐蔽bug。 - 这类库的常用API数量不多,加模块前缀的冗余成本极低,而且带前缀的写法可读性更强,看到
time.time()一眼就能知道方法来源,不用翻到文件头找导入语句确认。
用法存在差异的核心原因
本质是不同模块的设计定位和社区使用习惯不同:
- 像tkinter这类垂直领域的专用库,API体量很大、命名自带领域特征,加上社区几十年的教程、示例代码都默认用星号导入,已经形成了约定俗成的写法,星号导入提效的收益远大于命名冲突的风险。
- 像time这类通用工具库,API短、通用性强,和内置函数、其他第三方库重名的概率极高,常规导入带前缀的写法能从根源上避免命名空间污染,长期维护的成本更低。
通用最佳实践:除非是文档明确推荐星号导入的特定库,否则生产环境代码尽量不要用
from xxx import *,优先选常规导入,或者from xxx import 需要用到的具体成员的按需导入方式。
内容的提问来源于stack exchange,提问作者Arian
相关产品推荐
相关产品推荐

