今日学习目标:
- 理解循环导入问题,知道模块查找顺序
- 学习包的概念和软件开发目录规范
今日学习内容:
内容简要:
- 循环导入问题
- 判断文件类型
- 模块的查找顺序
- 绝对导入与相对导入
- 编程思想的演变
- 软件开发目录规范
内容详细:
循环导入问题
循环导入简单的说就是两个文件彼此相互导入
-
问题产生
循环导入的时候极有可能出现某个名字还没有被创建就使用的情况导致报错
-
问题解决
- 方式1:将导入模块的句式写在定义名字的下面
- 方式2:将导入模块的句式写在函数体代码内
-
问题归纳
因为这种导入方式比较复杂,在日常编程过程中尽量还是避免这样问题的产生
判断文件类型
-
文件的分类
- 执行文件
- 被执行文件
-
区分方法
使用内置变量__name__-
当__name__所在的文件是执行文件的时候 结果是__main__
-
当__name__所在的文件是被导入文件时候 结果是文件名(模块名)
-
-
总结
利用它的上述功能就可以借助于__name__区分被导入的代码和测试代码
方式
if __ name__ == '__ main__':
当前文件是执行文件的时候才会执行的子代码块
例子
# receiver.py print("receiver_haha") def test(): print("test can be called!") def receiver_print(): print("I'm receiver.py") if __name__ == '__main__': receiver_print()
# caller.py import receiver print("caller_haha") def test(): print("caller_test can be called!") def caller_print(): print("I'm caller.py") if __name__ == '__main__': caller_print() test()
运行结果
运行caller.py
总结
可以发现receiver.py中if __ name__=="__ main__"后语句没有执行,因为此时运行的是caller.py,而找不到进去receiver.py的入口!使用这种方法可以
控制代码的执行!
模块的查找顺序
-
查找顺序
- 先从内存空间中查找
- 再从内置模块中查找
- 最后去sys.path查找(类似于我们前面学习的环境变量)
因为sys.path返回的数据类型是列表
1、列表可以修改、我们导入的范围也可以通过修改sys.path这个列表获得暂时的修改。例如通过 sys.path.append()添加目录,导入额外目录的模块。
2、’列表是有序的,当搜索的过程当中,在第一个路径下搜索到了,就停止搜索。而且sys.path第一个路径是脚本的当前路径,所以禁止大家将自己的脚本命名成模块的名称。因此需要注意的是:自己模块命名的时候不能和系统的模块名称相同。
如果上述三个地方都找不到 那么直接报错!!!
绝对导入与相对导入
- 绝对导入
绝对导入从项目根文件夹中使用其完整路径导入指定的资源。
绝对导入的利弊
-
绝对导入是首选,因为它们非常明确和直接。仅仅通过查看语句就可以很容易地确定导入资源的位置。此外,即使导入语句的当前位置发生更改,绝对导入仍然有效。事实上,PEP 8明确建议绝对导入。
-
有时绝对导入会变得相当冗长,这取决于目录结构的复杂性。想象一下有这样的语句:from package1.subpackage2.subpackage3.subpackage4.module5 import function6 那太荒谬了,对吧?幸运的是,在这种情况下,相对导入是一个很好的选择!
-
- 相对导入
相当导入打破了必须参照执行文件的所在路径的要求 只需要考虑当前模块所在的路径然后使用特殊符号.去查找其他模块即可(from . import a)
相对导入只能在被导入文件中使用 不能在执行文件中使用
相对导入的利弊
- 相对导入的一个明显优势是它们相当简练。根据当前位置,它们可以将你之前看到的冗长的可笑的导入语句转换为简单的语句。
- 不幸的是,相对导入可能是混乱的,特别是对于目录结构可能改变的共享项目。相对导入也不像绝对导入一样可读,而且很难识别导入资源的位置。
编程思想的演变
-
基础阶段
此阶段写代码就是在一个文件内不停地堆叠代码的行数(面条版本) -
函数阶段
此阶段写代码我们学会了将一些特定功能的代码封装到函数中供后续反复调用 -
模块阶段
此阶段不单单是将功能代码封装成函数,并且将相似的代码功能拆分到不同的py文件中便于后续的管理
整个演变过程,最后想要的结果就是更加方便、快捷、高效的管理资源
软件开发目录规范
我们实际工作中编写的程序软件都是有很多文件夹和文件组成的。这些文件夹和文件其实都有各自存在的意义和主要功能。
种类 | 功能 |
---|---|
bin文件夹 | 存放程序的启动文件 |
conf文件夹 | 存放程序的配置文件 |
core文件夹 | 存放程序的核心业务(就是最为重要的代码 能够实现具体需求) |
lib文件夹 | 存放程序公共的功能 |
db文件夹 | 存放程序的数据 |
log文件夹 | 存放程序的日志记录 |
readme文本文件 | 存放程序的说明、广告等额外的信息 |
requirements.txt文本文件 | 存放程序需要使用的第三方模块及对应的版本 |
归纳与提醒
1.目录的名字可以不一致 但是主要的思想是一致的
2.主要作用就是为了便于管理 解耦合
今日学习时间:
这里统计计划学习的时间
1、 上午8:30~12:30
2、 下午2:30~5:30
3、 晚上6:30~9:30
今日学习产出:
这里统计学习计划的总量
- 1、 技术笔记 1遍
- 2、CSDN 技术博客 1篇
- 3、每日录音,预习明日内容