2018.10.15python学习第十九天part1

---恢复内容开始---

---
title: 标准目录规范
date: 2018-10-15 15:26:37
categories:python
tags:python入门

一.标准目录规范

​ 我们学习了模块和包以后,在开发项目就不应该在是面条版,应该分为文件/文件夹,那么有没有什么固定的文件结构呢?答案是:有的!这就是我们所说的开发目录规范。

​ 我们通过一些列子来说明这些文件夹的作用

eg:编写ATM

#file:'start.py'
def login():
	# load file
	with open('/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt')as f:
		print(f.read())
def register():
	print('register')
def run():
	while True:
		print('''1.login 2.reginster ''')
		choice = input('please choice:
')
        if choice == '1':
			login()
		elif choice == '2':
            register()
        else:
            print('choice error')

​ 在这个ATM中我们时常要使用到的文件路径,例如日志文件,数据文件等,并且不止一个地方用,如果直接写在code中,是不可取的,因为不可避免的要修改这些路径。

​ 所以,这些文件路径不要直接卸载code中,那么应该怎么做?定义为变量可行吗?当然可行,如此一来,修改的时候只要修改一次就可以了。

# file:'start.py'
# data
DB_PATH = '/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
# log
LOG_PATH ='/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
def login():
    # load file
    with open(BD_PATH)as f:
        print(f.read())
def register():
	print('register')
def run():
    while True:
        print('''1.login	2.register''')
        choice = input('please choice:
')
		if choice == '1':
            login()
		if choice == '2':
			register()
		else:
            print('choice error')

​ 但是当你想一想,此类用于配置程序的变量时,应该和你的业务逻辑放在一起吗?显然不应该,所以我们要将用于配置的信息单独放在一个文件中

# file:'setting.py'
# data
DATA_PATH = '/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
# log
LOG_PATH ='/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'

​ 2.在接下我们需要实现一个道理验证的功能,那这个功能,需要在所有关键操作之前进行验证,也就是很多功能中都要调用这个功能,由于start中代码太多,我们要进行拆分,这样一来,这个登录验证的code我们可以将其放置于一个公共的common中

common.py
# login 装饰器
def login_auth():
	pass

​ 3.除此以外,我们还有日志文件log,数据文件db;

​ 4.另外我们可以将程序的业务逻辑和启动code进行分离,变成start文件和src文件,其中

​ ①start.py文件专门用于执行启动;

​ ②scr中的逻辑code用来被start调用

​ 这样用户使用时就能很快定位到启动文件

​ 5.在一个项目中,可能有多个执行文件,那么我们可以统一到bin文件夹中

综上所述:一个规范的项目目录应包含以下结构:(除readme以外都是文件夹)

	bin
	
	core
	
	conf
	
	lib
	
	db
	
	log
	
	readme(介绍文件)

problem:这里的文件夹是普通文件夹还是包?

​ 1.先明确普通文件夹和包的区别

​ 包与普通文件夹的区别是包是含有init文件的,而init文件的作用就是将文件夹中的所有模

​ 块导入到init中,调用包实质也是调用init文件中的功能。

​ 2.判断每一个文件夹是否需要init这个功能

​ bin:执行文件夹,所以不需要被导入

​ conf:配置文件夹,在一个项目中,不可能只有一个配置文件,比如mysql,oracle,他

​ 们不是一家,如果把他们的配置全部集中到init文件中,这样显然不合适。所以不需

​ 要init的功能,不需要做包

​ core:业务逻辑文件夹,里面一定有一个用户的入口,用户进入以后只是在这些不同业务

​ 中来回执行操作,所以这个文件夹下的模块是相互调用的关系,不需要集合所有功

​ 能给外界调用,所以不需要做成包。

​ db,lib,log:很明显不需要

​ 3.那么什么样的code该定义为包呢?

​ 例如你有一个下载我呢见的模块,这里面可能用到了网络请求叫request.py,还有文件操

​ 作fileopt.py那么就应该定义为包,因为这两个文件中的功能都是给别人调用的!

综上所述:

​ 项目标准结构的第一层仅仅是文件夹,不是包

二.定制程序入口

​ 继续完善程序,使其可以展示用户功能界面,在src中定义run函数,用来启动程序,注意src所

在的code中可能有多个文件,用户在使用时不方便,所以我们的程序的入口从src中转移到start.py

中。

在start.py中导入core下的src并执行run

# file:'start.py'
import core.src
core.src.run()

​ 由于core这个模块并不存在于环境变量中,所以程序无法运行,所以:

第一步:在环境变量中添加core

#file:'start.py'
import sys
sys.path.append(r"C:\yyhpythonday20ATMcore")

import core.src
core.src.run()

​ 程序执行成功,但是以上写法存在两个问题

​ 1.除了core,其他的lib,conf就无法使用

​ 2.如果用户的安装路径不同,程序也无法运行

​ 为了能够找到所有模块,我们把ATM文件夹加入化境变量

# file:'start.py'
import sys
sys.path.append((r"C:\yyhpythonday20ATMcore")

​ 为了不同安装路径,程序也能运行,此时我们需要动态的获取单枪项目的目录

​ 在一个py文件中可以使用file来获取当前文件的路径

​ 通过当前文件路径来获取文件所在的目录,使用os.path.dirname

第二步:最终code

# file:'start.py'
import sys,os
BASE_DIR = os.path.dirname(os.path.dirnaem(__file__)))
sys.path.append(BASE_DIR)
import core.src
core.src.run()
三.使用标准目录后

1.引用配置文件

​ 在上述案例中,我们把我呢见的路径定义为变量并放在setting.py文件中,那么在src中要使用这

些变量,就需要导入conf下的setting.py

​ 由于在启动文件start.py文件中我们已经将项目根目录添加到path中,所以可以直接导入

# file:'src.py' 部分code
# 导入配置
from conf import setting
def login():
	# load file 并且使用配置文件中的路径
	with open(setting.BD_PATH) ad f:
		print(f.read())
def register():
	print('register')

2.引用自定义模块

​ 为上述案例添加日志功能

# file:'src.py'部分code
# log
def logger(msg):
	with open('/Users/jerry/PycharmProjects/ProjectStructure/log/log.txt')
	f.write(msg)
# load setting file
from conf import setting
	with open(setting.DB_PATH)as f:
		print(f.read())
    logger('xxx login system')
def register():
	print('register')

​ 日志功能并不是只有src文件使用,所以我们将它提取为单独的模块

​ 在lib下的common中

# file:'src.py' 部分code
# 导入配置文件获取,日志路径
from conf import setting
# 日志功能
def logger(msg):
	with open(setting.LOG_PATH) as f:
		f.write(msg)

在src中导入日志模块

# file:'src.py'部分code
from lib import common
# log功能
def logger(msg):
	with open('/Users/jerry/PycharmProjects/ProjectStructure/log/log.txt')as f:
	f.write(msg)
# 导入配置文件
from conf import setting
def login():
	# 加载文件 使用配置文件中的路径
	with open(setting.DB_PATH) as f:
		print(f.write(msg))
	logger('xxx login system)
def register():
	print('register')
		

---恢复内容结束---

---
title: 标准目录规范
date: 2018-10-15 15:26:37
categories:python
tags:python入门

一.标准目录规范

​ 我们学习了模块和包以后,在开发项目就不应该在是面条版,应该分为文件/文件夹,那么有没有什么固定的文件结构呢?答案是:有的!这就是我们所说的开发目录规范。

​ 我们通过一些列子来说明这些文件夹的作用

eg:编写ATM

#file:'start.py'
def login():
	# load file
	with open('/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt')as f:
		print(f.read())
def register():
	print('register')
def run():
	while True:
		print('''1.login 2.reginster ''')
		choice = input('please choice:
')
        if choice == '1':
			login()
		elif choice == '2':
            register()
        else:
            print('choice error')

​ 在这个ATM中我们时常要使用到的文件路径,例如日志文件,数据文件等,并且不止一个地方用,如果直接写在code中,是不可取的,因为不可避免的要修改这些路径。

​ 所以,这些文件路径不要直接卸载code中,那么应该怎么做?定义为变量可行吗?当然可行,如此一来,修改的时候只要修改一次就可以了。

# file:'start.py'
# data
DB_PATH = '/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
# log
LOG_PATH ='/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
def login():
    # load file
    with open(BD_PATH)as f:
        print(f.read())
def register():
	print('register')
def run():
    while True:
        print('''1.login	2.register''')
        choice = input('please choice:
')
		if choice == '1':
            login()
		if choice == '2':
			register()
		else:
            print('choice error')

​ 但是当你想一想,此类用于配置程序的变量时,应该和你的业务逻辑放在一起吗?显然不应该,所以我们要将用于配置的信息单独放在一个文件中

# file:'setting.py'
# data
DATA_PATH = '/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'
# log
LOG_PATH ='/Users/jerry/PycharmProjects/ProjectStructure/db/db.txt'

​ 2.在接下我们需要实现一个道理验证的功能,那这个功能,需要在所有关键操作之前进行验证,也就是很多功能中都要调用这个功能,由于start中代码太多,我们要进行拆分,这样一来,这个登录验证的code我们可以将其放置于一个公共的common中

common.py
# login 装饰器
def login_auth():
	pass

​ 3.除此以外,我们还有日志文件log,数据文件db;

​ 4.另外我们可以将程序的业务逻辑和启动code进行分离,变成start文件和src文件,其中

​ ①start.py文件专门用于执行启动;

​ ②scr中的逻辑code用来被start调用

​ 这样用户使用时就能很快定位到启动文件

​ 5.在一个项目中,可能有多个执行文件,那么我们可以统一到bin文件夹中

综上所述:一个规范的项目目录应包含以下结构:(除readme以外都是文件夹)

	bin
	
	core
	
	conf
	
	lib
	
	db
	
	log
	
	readme(介绍文件)

problem:这里的文件夹是普通文件夹还是包?

​ 1.先明确普通文件夹和包的区别

​ 包与普通文件夹的区别是包是含有init文件的,而init文件的作用就是将文件夹中的所有模

​ 块导入到init中,调用包实质也是调用init文件中的功能。

​ 2.判断每一个文件夹是否需要init这个功能

​ bin:执行文件夹,所以不需要被导入

​ conf:配置文件夹,在一个项目中,不可能只有一个配置文件,比如mysql,oracle,他

​ 们不是一家,如果把他们的配置全部集中到init文件中,这样显然不合适。所以不需

​ 要init的功能,不需要做包

​ core:业务逻辑文件夹,里面一定有一个用户的入口,用户进入以后只是在这些不同业务

​ 中来回执行操作,所以这个文件夹下的模块是相互调用的关系,不需要集合所有功

​ 能给外界调用,所以不需要做成包。

​ db,lib,log:很明显不需要

​ 3.那么什么样的code该定义为包呢?

​ 例如你有一个下载我呢见的模块,这里面可能用到了网络请求叫request.py,还有文件操

​ 作fileopt.py那么就应该定义为包,因为这两个文件中的功能都是给别人调用的!

综上所述:

​ 项目标准结构的第一层仅仅是文件夹,不是包

二.定制程序入口

​ 继续完善程序,使其可以展示用户功能界面,在src中定义run函数,用来启动程序,注意src所

在的code中可能有多个文件,用户在使用时不方便,所以我们的程序的入口从src中转移到start.py

中。

在start.py中导入core下的src并执行run

# file:'start.py'
import core.src
core.src.run()

​ 由于core这个模块并不存在于环境变量中,所以程序无法运行,所以:

第一步:在环境变量中添加core

#file:'start.py'
import sys
sys.path.append(r"C:\yyhpythonday20ATMcore")

import core.src
core.src.run()

​ 程序执行成功,但是以上写法存在两个问题

​ 1.除了core,其他的lib,conf就无法使用

​ 2.如果用户的安装路径不同,程序也无法运行

​ 为了能够找到所有模块,我们把ATM文件夹加入化境变量

# file:'start.py'
import sys
sys.path.append((r"C:\yyhpythonday20ATMcore")

​ 为了不同安装路径,程序也能运行,此时我们需要动态的获取单枪项目的目录

​ 在一个py文件中可以使用file来获取当前文件的路径

​ 通过当前文件路径来获取文件所在的目录,使用os.path.dirname

第二步:最终code

# file:'start.py'
import sys,os
BASE_DIR = os.path.dirname(os.path.dirnaem(__file__)))
sys.path.append(BASE_DIR)
import core.src
core.src.run()
三.使用标准目录后

1.引用配置文件

​ 在上述案例中,我们把我呢见的路径定义为变量并放在setting.py文件中,那么在src中要使用这

些变量,就需要导入conf下的setting.py

​ 由于在启动文件start.py文件中我们已经将项目根目录添加到path中,所以可以直接导入

# file:'src.py' 部分code
# 导入配置
from conf import setting
def login():
	# load file 并且使用配置文件中的路径
	with open(setting.BD_PATH) ad f:
		print(f.read())
def register():
	print('register')

2.引用自定义模块

​ 为上述案例添加日志功能

# file:'src.py'部分code
# log
def logger(msg):
	with open('/Users/jerry/PycharmProjects/ProjectStructure/log/log.txt')
	f.write(msg)
# load setting file
from conf import setting
	with open(setting.DB_PATH)as f:
		print(f.read())
    logger('xxx login system')
def register():
	print('register')

​ 日志功能并不是只有src文件使用,所以我们将它提取为单独的模块

​ 在lib下的common中

# file:'src.py' 部分code
# 导入配置文件获取,日志路径
from conf import setting
# 日志功能
def logger(msg):
	with open(setting.LOG_PATH) as f:
		f.write(msg)

在src中导入日志模块

# file:'src.py'部分code
from lib import common
# log功能
def logger(msg):
	with open('/Users/jerry/PycharmProjects/ProjectStructure/log/log.txt')as f:
	f.write(msg)
# 导入配置文件
from conf import setting
def login():
	# 加载文件 使用配置文件中的路径
	with open(setting.DB_PATH) as f:
		print(f.write(msg))
	logger('xxx login system)
def register():
	print('register')
		
原文地址:https://www.cnblogs.com/hello-yuanjing/p/9792772.html