模块补充和软件开发目录规范
目录
模块补充
循环导入
循环导入就是两个文件彼互相导入。循环导入的时候极有可能发现某个名字还没有被创建就使用的情况,引发报错导致程序终止。在实际编程中,尽量避免循环导入。
如果确实需要循环导入,那么需确保双方使用的名字都必须在导入前定义
方式1:先定义名字,再导入模块
方式2:将导入模块的句式写在函数体代码内
判断文件类型
py文件可以被分为两种类型
- 执行文件
- 被导入文件
内置变量__name__
当__name__所在的文件是执行文件的时候,结果是__main__
当__name__所在的文件是被导入文件时候,结果是模块名
# 创建一个md001.py文件
x = 88888
if __name__ == '__main__':
print('loaded md001')
else:
print('from md001')
# 创建一个执行文件导入md001.py文件
import md001
if __name__ == '__main__':
print(md001.x)
模块的查找顺序
- 先从内存空间中查找
- 再去内置模块中查找
- 最后到sys.path查找
# 验证先从内存空间中查找
import md001
import time
time.sleep(10) # 睡眠期间将md0011.py文件删除
print(md001.x)
# 验证从内置模块中查找
# 创建一个time.py文件
def func():
print('this is self-defined time module')
func()
# 创建一个执行文件导入time.py文件
import time
print(time)
print(time.time())
# 验证到sys.path中查找
import sys
print(sys.path) # 结果是一个列表,里面的元素是一个个路径
sys.path.insert(0, r'D:\PyCharm 2021\week4\day18\pkg') # 主动添加sys.path路径
print(sys.path)
import md001
绝对导入和相对导入
绝对导入
# 创建一个md002.py文件
smile = '^^^o^^^'
if __name__ == 'qqq.www.eee.md002':
print('from md002')
else:
print('loaded md002')
# 创建一个执行文件导入md002.py文件
from qqq.www.eee import md002
print(md002.smile)
相对导入
# 创建一个md003.py文件
smile = '---o---'
if __name__ != '__main__':
print('from md003')
else:
print('loaded md003')
from . import md002
print(md002.smile)
from qqq.www.eee import md003
# 创建一个执行文件导入md003.py文件
print(md003.smile)
包
什么是包?
包就是内部含有__init__.py的文件夹
__init__方法使用
# 在pkg文件夹(与执行文件路径一致)里创建一个md001.py文件
x = 88888
if __name__ == 'md001':
print('from md001')
# 在__init__.py中添加代码
from . import md001
# 创建一个执行文件导入pkg(包)
import pkg
print(pkg.md001.x)
软件开发目录规范
一、bin文件夹
存放程序的启动文件,例如start.py
二、conf文件夹
存放程序的配置文件,例如settings.py
三、 core文件夹
存放程序的核心业务,例如src.py
就是最为重要的代码 能够实现具体需求
四、 lib文件夹
存放程序公共的功能,例如common.py
五、 db文件夹
存放程序的数据,例如userinfo.txt,admininfo.txt
六、 log文件夹
存放程序的日志记录,例如log.log
七、 readme文本文件
存放程序的说明、广告等额外的信息
八、 requirements.txt文本文件
存放程序需要使用的第三方模块及对应的版本