大数跨境
0
0

终于把Python中模块导入机制讲清楚了!

终于把Python中模块导入机制讲清楚了! AI算法之道
2024-06-12
0
导读:Python中模块导入机制解释











01


引言



简单地说,模块就是Python中的文件。它也用于重用项目中的逻辑。虽然模块的定义很简单,但当我们在程序中导入任何模块时,后台都会发生很多事情。了解这些概念有助于我们决定如何为项目编写高效的代码。


闲话少说,我们直接开始吧!





02


 为什么使用模块?


模块常用于将我们的代码组织到不同的文件中。在大型项目中,模块尤其有用。以下是使用模块的一些重要原因。


  • 代码重用性:重用代码的最佳方法是将代码编写成小的模块,并导入到不同的地方。

  • 代码可维护性:对于大型项目来说,将逻辑分成不同的模块始终是一个好的做法。这有助于我们长期维护代码。
  • 避免冲突:每当我们导入任何模块时,它都会自动创建一个命名空间,这是代码的逻辑分隔。它有助于避免两个不同模块中相同变量或方法名称之间的冲突。

Python中基本上可以概括,共有两种类型的模块:

  • 内置模块 - 安装Python时默认捆绑的Python文件
  • 用户模块 - 用户为代码共享而创建的 Python 文件。




03


 举个栗子


讲了这么多文字,一定很枯燥吧。接着让我们创建一个非常简单的模块示例。

.├── main.py└── service.py

在本例中,我们的 main.py 脚本将导入 service.py 模块。代码如下:

import service
if __name__ == "__main__": print(service.get_users())

接着让我们来分析这个简单的语句import service在幕后是如何工作的。





04


  定位模块


当在代码中的import语句执行后,首先要做的就是在不同的位置(称为模块搜索路径)寻找对应模块。这些可能的寻找位置如下:

  • Current directory:  当前文件所在目录。Python将首先在当前项目根目录下搜索模块。
  • PYTHONPATH: 该环境变量有助于扩展模块搜索路径,并允许用户添加自己的自定义路径。
  • Standard library directories:这是安装所有标准库模块的位置。
  • Third-Party Extensions Path:  这是安装第三方库的位置(/lib/site-packages);它会自动添加到模块搜索路径中

所有这些路径都存储在系统库路径中,我们可以通过打印 sys.path 的结果看到这一点。





05


编译

在模块搜索路径中找到模块后,Python会将其编译成字节码,然后保存在 __pycache__ 文件夹中。下面是编译后的文件夹结构:

.├── __pycache__│   └── service.cpython-312.pyc├── main.py└── service.py

可以看到,这里多出了一个名为__pycache__ 的文件夹,文件名是 service.cpython-312.pyc这里,数字312代表编译模块时使用的Python版本(python3.12)。

这一步是可选的,因为当下次执行import语句时,Python 会首先查找 .pyc 文件。如果该字节代码已经存在,并且其版本号和时间戳没有更改,那么该模块将不会被再次编译。




06


运行

import操作的最后一步,解释器从上到下执行字节码。它加载模块内部所定义的所有函数和变量,并将其作为模块对象的属性。

完成最后一步后,service将作为模块对象被用户使用。我们可以通过 sys.modules进行检查,它会以字典对象的形式返回所有模块的列表。





07


总结

本文重点介绍了Python中模块如何在后台加载,并作为具有属性的对象提供给用户的。模块有利于编写易于维护和扩展的大型应用程序。了解模块的功能可以帮助我们做出改进代码的重要决定。例如,我们可以使用懒加载来避免导入一些不必要的模块。



您学废了嘛?






点击上方小卡片关注我




扫码进群,交个朋友!


【声明】内容源于网络
0
0
AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
内容 573
粉丝 0
AI算法之道 一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
总阅读23
粉丝0
内容573