• 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')
    		
    
  • 相关阅读:
    51nod1376 最长递增子序列的数量
    51nod1201 整数划分
    51nod1202 子序列个数
    51nod 博弈论水题
    51nod1052 最大M子段和
    51nod1678 lyk与gcd
    51nod1262 扔球
    BZOJ2763, 最短路
    吃西瓜 最大子矩阵 三维的。 rqnoj93
    noip2015 信息传递 强连通块
  • 原文地址:https://www.cnblogs.com/hello-yuanjing/p/9792772.html
Copyright © 2020-2023  润新知