iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中模块与包有相同名字的处理方法
  • 763
分享到

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

模块名字方法 2022-06-04 18:06:16 763人浏览 独家记忆

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 帖下有一些示例可以参考。当然,最好的方法是避免这样的设计,这样你就不会花那么长时间去查资料,也不会花那么长时间来写类似于本文的文章。

总结

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

--结束END--

本文标题: Python中模块与包有相同名字的处理方法

本文链接: https://www.lsjlt.com/news/13294.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP中与类名相同的方法是哪个
    这篇文章主要介绍了PHP中与类名相同的方法是哪个,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在PHP中,类名与方法名可以相同,如果方法名和类名相同,且没有“__constr...
    99+
    2023-06-15
  • Python DateTime的模块如何在相关类方法中的整理
    Python DateTime的模块如何在相关类方法中的整理,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。相关联的模块还有time与calendar 其中的time我们上面已经...
    99+
    2023-06-17
  • Python 自然语言处理:学习笔记中打包模块的实现方法
    Python 自然语言处理是一种非常流行的技术,它可以帮助我们处理各种文本数据,如电子邮件、社交媒体帖子、新闻文章等。在Python中,我们可以使用多种库和工具来进行自然语言处理,其中最常用的是NLTK(自然语言工具包)和spaCy。在本...
    99+
    2023-11-06
    学习笔记 打包 自然语言处理
  • Python中mmap模块处理大文本的操作方法
    目录mmap 介绍WindowsUnix支持的方法使用mmap读取大文件什么时候用mmap?总结:使用mmap的时机如果现在有一个需求,我们需要处理一个20G的大文件,我们会怎么处理...
    99+
    2023-02-07
    Python中mmap模块 Python mmap模块
  • 查看python中模块的所有方法
    随着使用python的时间越来越长,安装的python模块也越来越多,时间久了都不记得自己之前到底对自己的电脑做过些什么了,于是乎就想要查看一下自己安装的python模块,现将查看方法总结如下 一、命令行下使用pydoc命令 ...
    99+
    2023-01-31
    模块 方法 python
  • python中统计相同字符的个数方法实例
    目录输入描述:输出描述:知识点:1、Python 字符串中strip()方法2、Python 字符串中split()方法3、Python 字符串中lower()方法补充:python...
    99+
    2023-01-28
    Python字符统计 python如何统计输出个数 python统计字符的个数
  • python中有哪些模块重载的方法
    本篇文章为大家展示了python中有哪些模块重载的方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.pil...
    99+
    2023-06-14
  • python中模块导入的方法有哪些
    在Python中,模块导入的方法有以下几种:1. import语句:使用import关键字导入一个模块。例如:```import m...
    99+
    2023-09-13
    Python
  • python字符串处理与应用的方法有哪些
    Python字符串处理与应用的方法主要包括以下几种: 字符串拼接:使用"+"符号或者使用字符串的join方法...
    99+
    2024-02-29
    python
  • python中有哪些处理字符串的方法
    本篇文章给大家分享的是有关python中有哪些处理字符串的方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、join:将一个序列中的元素用某个字符(串)拼接,组成一个大的字...
    99+
    2023-06-15
  • Python中OS模块有哪些常用的方法
    这篇文章将为大家详细讲解有关Python中OS模块有哪些常用的方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。import os# 系统操作print(os.sep)&...
    99+
    2023-06-14
  • Python中的字典与JSON之间的相互转换方法有哪些?
    Python中的字典与JSON之间的相互转换方法有哪些?作为一种十分常用的数据结构,字典在Python中被广泛应用。而JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,也被广泛应用于网络数据传输和...
    99+
    2023-10-22
    字典 JSON 转换
  • django中的auth模块与admin后台管理方法
    目录1. auth模块1.1 auth模块的常用方法1.2 如何扩展auth_user表2.admin后台管理2.1 admin后台管理的准备工作2.2 为admin后台设置样式和增...
    99+
    2024-04-02
  • python字符串处理的方法有哪些
    Python中字符串处理的方法有很多,以下是其中一些常用的方法: 切片:可以使用索引和切片操作来获取字符串的子串。例如,使用`s...
    99+
    2023-10-24
    python
  • python处理字符串的方法有哪些
    Python处理字符串的常用方法有以下几种: 字符串拼接:使用"+"操作符将两个字符串连接起来。 字符串切片:...
    99+
    2024-02-29
    python
  • es6中数字处理的方法有哪些
    这篇文章给大家分享的是有关es6中数字处理的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。// Math.trunc方法用于去除一个数的小数部分,返回整数部分...
    99+
    2024-04-02
  • PHP中trait的使用和同时引入多个trait时同名方法冲突的处理方法
    目录一、trait的使用二、当父类、子类和trait的方法重名三、类内同时引入多个trait四、引入多个trait有同名方法五、当引入多个trait,同名方法解冲突后,同时使用所有冲...
    99+
    2023-05-18
    PHP中trait的使用 PHP多个trait冲突
  • Web中文字体处理的方法有哪些
    本篇内容介绍了“Web中文字体处理的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景介绍Web 项目中,使用一个合适的字体能给用...
    99+
    2023-06-27
  • IDEA中没有Mapper.xml模板选项的处理方法
    🎃New的时候没有Mapper.xml选项 在IDEA中导入模板即可 模板类容,复制粘贴即可 <?xml version="1.0" enc...
    99+
    2024-04-02
  • Python中对字典的几个处理方法分享
    目录字典求和列表剔重并计数获取字典中最大的value获取字典中出现value最大的key字典对应元素追加字典对应元素追加并剃重对字典进行过滤反转字典的方法(字典的key和value对...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作