python中每个模块都有一个名称_Python中模块与包有相同名字的处理方法

前言

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

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

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

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

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

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

1

2

3

4

5

6

7

8

9

.

├── main.py

└── same

├── api

│ └── __init__.py

├── auth

│ └── __init__.py

├── auth.py

└── __init__.py

其中:

same/api/__init__/py 的内容:

1

from .. import auth

same/auth/__init__.py 的内容:

1

auth_str = "This is str in package!"

same/auth.py 的内容:

1

auth_str= "This is str in module!"

main.py 的内容:

1

2

3

4

5

6

7

8

from __future__import print_function

from same.apiimport 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,得到的结果都是:

1

This is str in package!

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

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

文档中有如下一段描述:

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

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当我们在使用 Python 进行开发时,为了方便重复使用代码,我们会将相关的代码进行组织、封装,这里涉及了四个概念:模块、类、包和库。 1. 模块:简单来说,就是 Python 一个文件,它包含了 Python 定义和声明的函数、变量和类等内容。Python 的许多功能都是通过模块实现的,如 os 模块、random 模块等。使用模块可以让代码更好地组织和共享,避免重复编写,方便维护和修改。 2. 类:是一种用户自定义的类型,它由方法和属性组成。类可以看作是一种数据类型的模板,利用它可以创建多个具有相同属性和行为的对象。类在 Python 是一种重要的面向对象编程的特性。 3. 包:是一种组织模块的方式,将模块以文件夹嵌套的方式进行组织。一个可以包含其他模块或子包,通常还会包含一个__init__.py 文件。__init__.py 文件可以用来初始化包的属性和方法等信息,也可以将包需要导入的模块进行声明。 4. 库:是一种可重用的代码集合,通常包含多个模块和包。库可以让开发者方便地使用各种由其他人编写的函数和类来实现自己的程序,比如在 Python 常用的库有 NumPy 和 Pandas 等。这些库通过提供各种功能的接口使得开发者可以更加方便地进行数据处理和分析等操作。 总之,模块、类、包和库都是 Python 代码组织的重要结构,掌握它们的使用和概念可以让我们更好地编写 Python 代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值