Python中模块与包有相同名字的处理方法

发布时间 - 2026-01-11 00:58:39    点击率:

前言

在编程开发中,个人觉得,只要按照规范去做,很少会出问题。刚开始学习一门技术时,的确会遇到很多的坑。踩的坑多了,这是好事,会学到更多东西,也会越来越觉得按照规范做的重要性,规范的制定就是用来规避问题的。有时候确实应该听听有经验人的建议,不要一意孤行。这好像不是本文的重点,其实我重点是想表达,尽量按规范做事,这样会少走很多弯路。

我现在使用的主力编程语言是 Python,在接触 Python 至今,我感觉我踩的坑还是极少的,基本上没有遇到什么奇怪的问题。实际上,这并不是一件好事,不踩坑,很多躺在暗处的知识点你不会了解,所以也很难成长。幸好,有一些会踩坑的同事。

一同事问我,在 Python 中,如果一个模块和一个包同名时,是不是只能导入包,如果要导入模块该怎么办。他的意思大概是这样的,在项目的同一级目录下,有一个 foo.py 文件和一个 foo/ 目录,如果 import foo 会导入 foo/ 的内容而不是 foo.py 的内容。

被问到这个问题时,我首先感觉到的是诧异,这明显是存在歧义的。如果是我,肯定不会把模块名和包名设计成一样的名字,因为本质上来说在导入的时候没法区分到底要导入谁。除非系统有特别的规定,例如,规定这种情况只能导入包。

我的潜意识里认为这里应该报错,Python 解释器不知道要导入谁。但是,同事告诉我,别人的代码是这么写的,而且在这种情况下会默认导入包。那就是可以的咯,而且解释器已经规定这种情况会总是导入包。

为了验证下这一点,我写了个简单的项目,项目结构如下:

.
├── main.py
└── same
 ├── api
 │ └── __init__.py
 ├── auth
 │ └── __init__.py
 ├── auth.py
 └── __init__.py

其中:

same/api/__init__/py 的内容:

from .. import auth

same/auth/__init__.py 的内容:

auth_str = "This is str in package!"

same/auth.py 的内容:

auth_str = "This is str in module!"

main.py 的内容:

from __future__ import print_function

from same.api import auth

# Script starts from here

if __name__ == "__main__":
 print(auth.auth_str)

稍微有些复杂,哈哈,主要是同事那儿大致的结构是这样的,这里是为更好的模拟下。我在 same.auth 包中定义了一个 auth_str 字符串,又在同名的 same.auth 模块中定义了一个同名的 auth_str 字符串,然后在 same.api 包尝试导入 auth,最后在 main.py 尝试输出 same.api.auth.auth_str,看看到底哪个字符串会被打印。同时尝试用 Python2 和 Python3 执行 main.py,得到的结果都是:

This is str in package!

这里验证了我们的猜想是正确的,解释器的确只导入了包中内容。但是,我并不知道是否有官方的资料说明就是这样的,所以我不敢确信,万一这只是巧合呢。

于是,我开始查资料来验证这一结论。我就说实话吧,对于一个英文水平烂到你无法想象的我,只能先尝试用百度搜索下答案了。事实是,用百度往往都是遗憾的。片刻后,无果,我只能硬着头皮尝试英文搜索了。于是,在 stackoverflow 上找到了如下提问:

How python deals with module and package having the same name?

其中有一个人回答说 Python 官方文档中在描述模块搜索路径时提到了这一点:https://docs.python.org/3/tutorial/modules.html#the-module-search-path.

文档中有如下一段描述:

After initialization, Python programs can modify sys.path. The directory containing the script being run is placed at the beginning of the search path, ahead of the standard library path. This means that scripts in that directory will be loaded instead of modules of the same name in the library directory. This is an error unless the replacement is intended. See section Standard Modules for more information.

也就是说,目录在库的搜索路径下会首先被搜索,这就意味着目录会代替同名的模块被加载。

这下终于放心了,之前的结论得到证实。在 Python 中,如果尝试导入同名的模块和包时,包会被导入。这种情况下,如果想要导入模块,恐怕要用一些 ‘hack' 的方法,上面提到的 stackoverflow 帖下有一些示例可以参考。当然,最好的方法是避免这样的设计,这样你就不会花那么长时间去查资料,也不会花那么长时间来写类似于本文的文章。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# python  # 模块  # 包管理  # python的包和模块  # python基础之包的导入和__init__.py的介绍  # Python模块包中__init__.py文件功能分析  # python学习之第三方包安装方法(两种方法)  # 浅析Python中signal包的使用  # Python中.py文件打包成exe可执行文件详解  # Python中的模块和包概念介绍  # Pycharm导入Python包  # 模块的图文教程  # python动态加载包的方法小结  # Python中__init__.py文件的作用详解  # Python包  # __init__.py功能与用法分析  # 都是  # 是这样  # 长时间  # 英文  # 这种情况  # 用百度  # 的是  # 包中  # 这是  # 有一  # 我就  # 这一  # 文档  # 我在  # 也会  # 告诉我  # 最好的  # 你就  # 很难  # 我现在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Linux系统命令中tree命令详解  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  开心动漫网站制作软件下载,十分开心动画为何停播?  如何快速搭建二级域名独立网站?  LinuxShell函数封装方法_脚本复用设计思路【教程】  ,网页ppt怎么弄成自己的ppt?  三星、SK海力士获美批准:可向中国出口芯片制造设备  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Laravel如何实现API资源集合?(Resource Collection教程)  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  高端企业智能建站程序:SEO优化与响应式模板定制开发  简单实现Android文件上传  在线制作视频网站免费,都有哪些好的动漫网站?  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Python文本处理实践_日志清洗解析【指导】  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Python结构化数据采集_字段抽取解析【教程】  如何在阿里云高效完成企业建站全流程?  如何在Windows服务器上快速搭建网站?  香港服务器租用每月最低只需15元?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何快速建站并高效导出源代码?  网站制作免费,什么网站能看正片电影?  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  googleplay官方入口在哪里_Google Play官方商店快速入口指南  html5的keygen标签为什么废弃_替代方案说明【解答】  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  如何选择PHP开源工具快速搭建网站?  Laravel如何配置任务调度?(Cron Job示例)  郑州企业网站制作公司,郑州招聘网站有哪些?  如何生成腾讯云建站专用兑换码?  如何用花生壳三步快速搭建专属网站?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  php json中文编码为null的解决办法  java获取注册ip实例  大连 网站制作,大连天途有线官网?