Python——目录规范

标准目录规范

在学习模块和包之前,就已经写过了ATM和购物车的项目,但是当时我们没有学习模块和包,所以当时是所有的函数功能都写在一个.py文件当中,虽然实现了功能,但是当时就发现,在实际写代码时,过程非常的复杂,看起来比较乱,所以在学习模块和包以后呢,我们应该根据项目,应该分什么文件,分什么样的文件夹,那么在初期呢,我们有一个固定的文件结构,就是今天的要说的开发的标准目录规范。

配置文件

e.g. case : ATM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 此代码块用于表示我的目录
# /Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范

标准目录规范 ————————
| # 文件和模块
bin-------------- start.py
|
config----------- settings.py
|
core------------- ATM.py
|
db--------------- db.txt
|
lib-------------- common.py
|
log-------------- log.txt
|
readme.txt(说明文档)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# file: 'start.py'  

# 登陆
def login():
with open('/Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范/db/db.txt','rt',encoding='utf-8') as read_f:
print(read_f.read())
# oOC:12345678:10000 (name:password:balance)

# 注册
def register():
with open('/Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范/db/db.txt','at',encoding = 'utf-8') as read_f:
new_account = input('Enter your new acount: ').strip()
read_f.append('\n%s:12345678:0' %new_account)
print('Register')

# 程序运行入口
def start():
while True:
print(
'''
1.login
2.register
''')
select = input('make your choice: ')
if select == '1':
login()
elif select == '2':
register()
else:
print('Error')

start()

在case中,可以发现我们使用到了文件的路径,在之后的功能中,日志文件,或者数据文件等,我们会不止一次的使用到文件路径,那么我们每一次直接将路径写在代码中,效率是非常低的,不可取,因为这只是在我们自己的电脑上用时,路径是这样的,但是当移植到别人的电脑上时,路径就会发生改变,所以我们不可避免的会需要修改这些路径。

所以不要直接写在代码中,我们可以通过定义一个变量,然后在修改的时候只需要修改一次,其次,也简化了书写。

1
2
3
4
5
6
7
8
# file: 'start.py'
# 用户数据路径
DB_PATH = '/Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范/db/db.txt'

# 日志路径
LOG_PATH = '/Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范/log/log.txt'

# 在python中的常量,通常通过全部大写的变量名来定义,但是其本质和一个普通变量没有区别,但是大家统一用全部大写来定义一个常量

​ 通常这类用于配置程序的变量,我们应该将它们都统一的放到单独的配置文件当中,不应该与我们的函数功能存放在一起。所以更好的做法是新建一个文件,将配置文件放进去。

1
2
3
4
5
6
7
8
# 所以我们有了config这个文件夹,并在里边创建一个settings.py文件
# file:'settings.py'
# 将配置信息写入settings.py
# 用户数据路径
DB_PATH = '/Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范/db/db.txt'

# 日志路径
LOG_PATH = '/Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范/log/log.txt'

公共模块

通常我们还会在很多时候,在进行关键操作之前需要进行验证,也就是说例如在atm功能中,在转账、提现、存款时,无论想要操作哪一步都需要先进行登陆验证,那么这时候这个验证功能的函数,就属于公共模块。

1
2
3
4
# file: 'common.py'
# 登陆验证装饰器
def login_auth():
pass

日志文件 log.txt 和 数据文件 db.txt

区分业务逻辑和启动代码

另外我们可以将程序的业务逻辑和启动代码,进行分离,创建一个start.py 和 将业务逻辑模块放入core文件夹中(e.g. ATM.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# file: 'ATM.py'
# 登陆
def login():
with open('/Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范/db/db.txt','rt',encoding='utf-8') as read_f:
print(read_f.read())
# oOC:12345678:10000 (name:password:balance)

# 注册
def register():
with open('/Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范/db/db.txt','at',encoding = 'utf-8') as read_f:
new_account = input('Enter your new acount: ').strip()
read_f.append('\n%s:12345678:0' %new_account)
print('Register')

# 程序运行入口
def start():
while True:
print(
'''
1.login
2.register
''')
select = input('make your choice: ')
if select == '1':
login()
elif select == '2':
register()
else:
print('Error')

# file: 'start.py'
start()

执行文件

最后start.py就是一个执行文件通常我们放在bin文件夹中,即使有多个执行文件,我们也可以将其统一到bin文件夹中。

定制程序的入口

为了给用户提供便利,我们程序的入口应该从core业务逻辑中转移到start.py文件中,所以我们需要将start.py中导入core下的ATM并执行start。

1
2
3
4
5
6
7
8
9
# file:'start.py'
import core.ATM
core.ATM.start()

# 运行结果
Traceback (most recent call last):
File "/Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范/bin/start.py", line 16, in <module>
import core.ATM
ModuleNotFoundError: No module named 'core'

很显然这样配置之后,我们以为导入了 ‘core’ 模块,但是运行结果很明确的告诉我们没有找到名字叫 ‘core’ 的模块,所以我们需要导入模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# file: 'start.py'
import sys,os

print(__file__)
# /Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范/bin/start.py
print(os.path.dirname(__file__))
# /Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范/bin
print(os.path.dirname(os.path.dirname(__file__)))
# /Users/ooc/Desktop/Python 学习笔记/day19/标准目录规范

# 为了能够找到所有模块,把‘标准目录规范’下的下的所有文件夹导入到环境变量中
BASE_DIC = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIC)

import core.ATM
core.ATM.start()
# 定制程序的入口就结束啦

使用标准目录后

引用配置文件

在上述的case中,我们把文件的路径等配置文件,放在了 settings.py 文件中,那么我们在ATM中要使用这些配置文件,就需要导入config下的settings.py

1
2
3
4
5
6
7
8
9
10
# file: 'ATM.py'
# 导入配置文件 settings.py
from config import settings

def login():
with open(settings.DB_PATH,'rt',encoding='utf-8') as read_f:
# 这里用settings.DB_PATH来调用读取文件路径
print(read_f.read())

...

引用自定义模块

为之前的功能添加日志功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# file: 'common.py'
# 导入配置文件 config 下的 settings 模块
from config import settings

# 新增一个日志功能
def logger(msg):
with open(settings.LOG_PATH,'at',encoding='utf-8') as write_f:
write_f.write(msg)

# file: 'ATM.py'
from lib import common
def login():
with open(DB_PATH,'rt',encoding='utf-8') as read_f:
print(read_f.read())
print('Login')
common.logger('XXX登陆系统\n')