全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

前言

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

我现在使用的主力编程语言是 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功能与用法分析  # 都是  # 是这样  # 长时间  # 英文  # 这种情况  # 用百度  # 的是  # 包中  # 这是  # 有一  # 我就  # 这一  # 文档  # 我在  # 也会  # 告诉我  # 最好的  # 你就  # 很难  # 我现在 


相关文章: 如何基于PHP生成高效IDC网络公司建站源码?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  高防服务器:AI智能防御DDoS攻击与数据安全保障  网站制作价目表怎么做,珍爱网婚介费用多少?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  定制建站如何定义?其核心优势是什么?  如何快速搭建响应式可视化网站?  如何选择高性价比服务器搭建个人网站?  建站主机核心功能解析:服务器选择与网站搭建流程指南  ,想在网上投简历,哪几个网站比较好?  如何在腾讯云免费申请建站?  ,制作一个手机app网站要多少钱?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  建站之星CMS建站配置指南:模板选择与SEO优化技巧  济南企业网站制作公司,济南社保单位网上缴费步骤?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  如何制作算命网站,怎么注册算命网站?  制作企业网站建设方案,怎样建设一个公司网站?  简单实现Android验证码  建站之星如何配置系统实现高效建站?  全景视频制作网站有哪些,全景图怎么做成网页?  如何在阿里云香港服务器快速搭建网站?  如何在阿里云ECS服务器部署织梦CMS网站?  贸易公司网站制作流程,出口贸易网站设计怎么做?  如何破解联通资金短缺导致的基站建设难题?  济南网站制作的价格,历城一职专官方网站?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  常州企业网站制作公司,全国继续教育网怎么登录?  简历在线制作网站免费版,如何创建个人简历?  ,巨量百应是干嘛的?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  如何用AWS免费套餐快速搭建高效网站?  如何通过wdcp面板快速创建网站?  如何在IIS7中新建站点?详细步骤解析  MySQL查询结果复制到新表的方法(更新、插入)  如何快速查询网站的真实建站时间?  如何安全更换建站之星模板并保留数据?  建站之星如何开启自定义404页面避免用户流失?  北京的网站制作公司有哪些,哪个视频网站最好?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  如何快速使用云服务器搭建个人网站?  如何通过虚拟主机空间快速建站?  如何通过虚拟主机快速搭建个人网站?  如何在万网开始建站?分步指南解析  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。