2018.10.15python学习第十九天part1

Posted CUIHUANIHAO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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‘)
        








以上是关于2018.10.15python学习第十九天part1的主要内容,如果未能解决你的问题,请参考以下文章

学习python课程第十九天

Python 学习第十九天 django知识

python学习第十九天:re,sys,suprocess模块

python学习之第十九天

python学习第十九天三元运算符与php语言区别

孤荷凌寒自学python第六十九天学习并实践beautifulsoup对象用法2