位置: 编程技术 - 正文

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

编辑:rootadmin

推荐整理分享Python中模块与包有相同名字的处理方法(python的模块和包),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python中模块的定义,python 模块 库 区别,python 模块 库 区别,python 模块 库 区别,python中模块包库的意义,python 模块 库 区别,python中模块和包,python中模块包和库的意义,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

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

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

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

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

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

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

其中:

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

same/api/__init__/py 的内容:

same/auth/__init__.py 的内容:

same/auth.py 的内容:

main.py 的内容:

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

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

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

How python deals with module and package having the same name&#;

其中有一个人回答说 Python 官方文档中在描述模块搜索路径时提到了这一点: 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的模块和包

本文链接地址:https://www.jiuchutong.com/biancheng/375619.html 转载请保留说明!

上一篇:详解python 字符串和日期之间转换 StringAndDate(python字符串常用方法)

下一篇:Django的信号机制详解(django的工作原理)

  • 税务机关的义务是依法征管
  • 算税负是用含税的吗
  • 什么情况下核定征收转为查账征收
  • 土地出让价款
  • 30万免税超过30万
  • 合伙开有限公司注销流程
  • 农产品计算抵扣的税务政策
  • 行政运行经费包括项目支出吗
  • 企业之间借款利息进项税可以抵扣吗
  • 应收账款计提坏账比例
  • 代发工资开票内容
  • 税前计提工资福利费用如何做会计核算?
  • 车间固定资产折旧属于什么科目
  • 取得投资收益会导致经营现金流量小于
  • 注册资本的变更
  • 企业所得税退税怎么做账务处理
  • 每月收到融资租赁费利息发票
  • 物业公司收的电梯费如何做账
  • 进口商品的关税计入入账价值吗
  • 全年平均职工人数按季度平均公式
  • 会计事务所成本核算方法
  • 个人给单位垫付的款怎么做账
  • excel合并的单元格怎么填充序列
  • 办公家具折旧年限及计算方法
  • 苹果手机id被锁定什么意思
  • win10如何设置闹钟
  • 房屋扩建折旧年限怎么算
  • 工厂返费能拿到吗
  • 公司出售已经提完折旧的机器
  • PHP:session_cache_expire()的用法_Session函数
  • 财务费用利息收入怎么结转
  • 厂房押金收据范本
  • 1050ti能玩绝地求生吗
  • 摇篮山圣克莱尔湖国家公园
  • 机器设备拆除增值税税率
  • vue怎么做兼容
  • 现金日记账怎么记账
  • 约克郡在哪
  • 公司借款利息可以用对公户转账吗
  • 2023年顶会、顶刊SNN相关论文----------持续更新中
  • 对公账户的银行卡号是几位数
  • 微信小程序怎么制作自己的小程序
  • 贷款和应收款项属于金融资产的哪类
  • 企业的日常活动都有哪些
  • 综合所得内容有哪些
  • Servlet4.0 Response
  • db2原理
  • 教大家8天学通MongoDB——第一天 基础入门篇
  • 本月损益类未结转为零的一级科目6603
  • 主要业务是生产销售家电
  • 应纳税的物品有哪些
  • 网上交税已经缴费怎么退
  • 退休后的税费
  • 股权转让,受让方的会计分录
  • 收到商业汇票计什么科目
  • 应收账款和应付账款的管理
  • 印花税需要计提吗2023
  • 工会经费计提按照应发工资还是实发工资
  • 税控盘服务费会计科目
  • 服务业成本的会计核算
  • 减值损失账务处理
  • 工业企业如何建立税务风险预警体系工作表
  • 库存商品账本填写样本
  • 445端口 关闭
  • ubuntu复制文件到当前文件夹
  • win8应用程序无法正常启动
  • win8.1企业版激活密钥最新
  • winxp如何删除网卡驱动
  • win7 桌面空白
  • js自动输入
  • 应用web标准实例是什么
  • 使用linux的收获心得
  • unity程序开发
  • android 进程通信
  • Activity的四种加载模式
  • android程序崩溃会被重启
  • 国家企业税务总局
  • 环保税按次申报需要交滞纳金吗
  • 上饶二手房契税
  • 个体户是否需要缴纳企业所得税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设