You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:55:14