首页 > 编程语言 >Python - 模块包

Python - 模块包

时间:2024-04-30 21:55:57浏览次数:25  
标签:dir2 dir1 Python py init 模块 import mod

目录

包导入示例

下列三个文件分别位于目录dir1 以及 dir1 的子目录 dir2中,这些文件的路径名在注释中给出:

# dir1\__init__.py
print('dir1 init')
x = 1

# dir1\dir2\__init__.py
print('dir2 init')
y = 2

# dir1\dir2\mod.py
print('in mod.py')
z = 3

这里,dir1 要么是我们当前工作所在目录的(也就是主目录)的子目录,要么就是位于模块搜索路径中(实际就是sys.path)的一个目录的子目录。无论哪一种,dir1 的容器都不需要_init_.py 文件。

当Python 向下搜索路径的时候,import 语句会在目录首次遍历时执行该目录的初始化文件。这里使用print 语句来跟踪它们的执行:

>>> import dir1.dir2.mod                                              
dir1 init
dir2 init
in mod.py
>>> import dir1.dir2.mod 
>>> 

就像模块文件一样,任何已导入的目录也可以传递给reload,来强制该项目重新执行。就像这里展示的那样,reload 可以接受点号路径名称来重新载入嵌套的目录和文件:

>>> from importlib import reload
>>> reload(dir1) 
dir1 init
<module 'dir1' from 'E:\\PyProject\\dir0\\dir1\\__init__.py'>
>>> reload(dir1.dir2) 
dir2 init
<module 'dir1.dir2' from 'E:\\PyProject\\dir0\\dir1\\dir2\\__init__.py'>
>>> 

一旦导入后,import 语句内的路径会变成脚本中共的一条嵌套对象路径。在这里mod 是一个嵌套在dir2 中的子对象,而dir2又嵌套在dir1 中:

>>> dir1
<module 'dir1' from 'E:\\PyProject\\dir0\\dir1\\__init__.py'>
>>> dir2   # 无法直接方法
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'dir2' is not defined. Did you mean: 'dir1'?
>>> dir1.dir2
<module 'dir1.dir2' from 'E:\\PyProject\\dir0\\dir1\\dir2\\__init__.py'>
>>> dir1.dir2.mod
<module 'dir1.dir2.mod' from 'E:\\PyProject\\dir0\\dir1\\dir2\\mod.py'>

实际上,路径中的每个目录名称都会变成赋值了模块对象的变量,而该模块对象的命名空间则是由该目录内的_init_.py 文件中共所有赋值语句进行初始化的。dir1.x 引用了在dir1._init_.py 中赋值的x 变量,mod.z 则引用了在mod.py 内赋值的变量z:

>>> dir1.x
1
>>> dir1.dir2.y 
2
>>> dir1.dir2.mod.z
3
>>> dir1.dir2.mod.y  # 不能访问y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'dir1.dir2.mod' has no attribute 'y'
>>>

包的from 语句 vs 包的 import 语句

当import 语句和 包一起使用时可能有些不便,因为必须经常在程序中重新输入路径。例如,上一节的例子中,每次要得到z时,就得从dir1 开始重新输入完整得路径,并且每次都要重新执行整个路径。如果你想要尝试直接读取dir2 或 mod ,就会得到一个错误:

>>> dir2.mod
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'dir2' is not defined. Did you mean: 'dir1'?
>>> mod.z
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'mod' is not defined

因此,我们可以 让包使用from语句,来避免每次读取时都要重新输入路径,通常这样比较方便。也许更重要得是,如果你重新改变目录结构,那么from语句只需要在程序代码中共更新一次路径,import 则需要修改很多地方,它提供了一个完整路径较短得同义词,并在出现多个同名模块得时候充当重新命名得工具:

>>> from dir1.dir2 import mod                                         
dir1 init
dir2 init
in mod.py
>>> mod.z
3   
>>> import dir1.dir2.mod as mod
>>> mod.z
3   
>>> 

标签:dir2,dir1,Python,py,init,模块,import,mod
From: https://www.cnblogs.com/czzz/p/18168751

相关文章

  • [python] 基于PyWaffle库绘制华夫饼图
    华夫饼图Wafflechart是一种独特而直观的图表,用于表示分类数据。它采用网格状排列的等大小方格或矩形,每个方格或矩形分配不同的颜色或阴影来表示不同的类别。这种可视化方法有效地传达了每个类别在整个数据集中的相对比例。本文介绍如何使用基于Python的PyWaffle库绘制华夫饼图。P......
  • LoRa模块在智能灌溉系统中的应用特点介绍
    LoRa模块在智能灌溉系统中的应用特点主要体现在以下几个方面:低功耗与长寿命:LoRa模块具有极低的功耗,使其在待机状态下耗电量极低,能够支持长时间连续运行,减少了频繁更换电池或充电的需求,确保了智能灌溉系统的长期稳定运行。远程监控与控制:通过LoRa模块构建的无线通信网络,可......
  • python+requests爬取B站视频保存到本地
    importosimportdatetimefromdjango.testimportTestCase#Createyourtestshere.importrequestsimportreimportjsonimportsubprocessfromconcurrent.futuresimportThreadPoolExecutordefdownload_video(url):#file_path='django3+dr......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-42-强大的可视化追踪利器Trace
    1.简介在我们日常执行自动化测试工作的过程中,经常会遇到一些偶发性的bug,但是因为bug是偶发性的,我们不一定每次执行都能复现,所以我们在测试执行的时候,追踪用例执行就变得非常重要了。playwright提供了一个PlaywrightTraceViewer工具来追踪测试执行,这是一个GUI工具,我们可以通过它......
  • python airllm调用本地大模型
    官方demohttps://github.com/lyogavin/Anima/blob/main/air_llm/examples/run_all_types_of_models.ipynb这里使用百川本地fromairllmimportAirLLMLlama2,AutoModelMAX_LENGTH=128#默认会去抱脸网下载,很慢,而且需要xx上网#model=AutoModel.from_pretrained("baichua......
  • 无线模块透明传输原理及过程解析
    透明传输,顾名思义,是指在传输过程中对外界完全透明,不需要关注传输过程以及传输协议,最终目的是要把传输的内容原封不动地传递给接收端,发送和接收的内容完全一致。在无线模块中,透明传输通常是通过特定的技术和机制来实现的。无线模块透明传输的原理主要基于串口数据的透明传输。这种......
  • 无线模块空中唤醒技术原理详解
    空中唤醒功能,英文名称为WakeonRadio(WOR),其原理主要是通过减少接收端射频处于接收状态的时间,而在其余时间使设备处于深度睡眠模式,以此来实现设备功耗的显著降低。这种机制确保了设备在不需要接收数据时保持低功耗状态,而在需要接收数据时能够迅速被唤醒至接收状态。具体来说,空......
  • BOSHIDA AC/DC电源模块的电磁兼容性分析与方案设计
    BOSHIDAAC/DC电源模块的电磁兼容性分析与方案设计BOSHIDAAC/DC电源模块是一种将交流电转换为直流电的电源模块,常用于各种电子设备中。然而,由于电磁干扰可能会对设备的正常运行造成影响,因此需要对AC/DC电源模块的电磁兼容性进行分析和方案设计。 首先,我们需要对AC/DC电源模......
  • python匿名函数、内置函数以及各类高阶函数等
    【一】匿名函数【1】函数的分类#【1】正规函数deflogin():...login()#【2】匿名函数(无名函数)#语法:lambda参数:表达式#lambda:匿名函数的关键字#参数可以放位置参数以及关键字参数...#表达式:其实本质上是返回值【2】定义匿名函数Python使用lamb......
  • C/C++、Java 与 Python 中未初始化变量的处理比较
    在C/C++中,未初始化的变量的值是不确定的,可能是随机的。 在Python中,如果直接使用未初始化的变量,会引发NameError异常。Python要求变量在使用前必须进行赋值或初始化。 而在Java中,直接使用未初始化的局部变量会导致编译错误,必须先对变量进行初始化。 C++和Java在字......