Python 3 软件开发规范

参考链接 http://www.cnblogs.com/linhaifeng/articles/6379069.html#_label14

对每个目录,文件介绍。

 #=============>bin目录:存放执行脚本

 #start.py

 import sys,os

 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

 sys.path.append(BASE_DIR)

 from core import core

 from conf import my_log_settings

 if __name__ == '__main__':

     my_log_settings.load_my_logging_cfg()

     core.run()

 #=============>conf目录:存放配置文件

 #config.ini

 [DEFAULT]

 user_timeout = 1000

 [egon]

 password = 123

 money = 10000000

 [alex]

 password = alex3714

 money=10000000000

 [yuanhao]

 password = ysb123

 money=10

 #settings.py

 import os

 config_path=r'%s\%s' %(os.path.dirname(os.path.abspath(__file__)),'config.ini')

 user_timeout=10

 user_db_path=r'%s\%s' %(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),\

                      'db')

 #my_log_settings.py

 """

 logging配置

 """

 import os

 import logging.config

 # 定义三种日志输出格式 开始

 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \

                   '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字

 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

 id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'

 # 定义日志输出格式 结束

 logfile_dir = r'%s\log' %os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # log文件的目录

 logfile_name = 'all2.log'  # log文件名

 # 如果不存在定义的日志目录就创建一个

 if not os.path.isdir(logfile_dir):

     os.mkdir(logfile_dir)

 # log文件的全路径

 logfile_path = os.path.join(logfile_dir, logfile_name)

 # log配置字典

 LOGGING_DIC = {

     'version': 1,

     'disable_existing_loggers': False,

     'formatters': {

         'standard': {

             'format': standard_format

         },

         'simple': {

             'format': simple_format

         },

     },

     'filters': {},

     'handlers': {

         #打印到终端的日志

         'console': {

             'level': 'DEBUG',

             'class': 'logging.StreamHandler',  # 打印到屏幕

             'formatter': 'simple'

         },

         #打印到文件的日志,收集info及以上的日志

         'default': {

             'level': 'DEBUG',

             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件

             'formatter': 'standard',

             'filename': logfile_path,  # 日志文件

             'maxBytes': 1024*1024*5,  # 日志大小 5M

             'backupCount': 5,

             'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了

         },

     },

     'loggers': {

         #logging.getLogger(__name__)拿到的logger配置

         '': {

             'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕

             'level': 'DEBUG',

             'propagate': True,  # 向上(更高level的logger)传递

         },

     },

 }

 def load_my_logging_cfg():

     logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置

     logger = logging.getLogger(__name__)  # 生成一个log实例

     logger.info('It works!')  # 记录该文件的运行状态

 if __name__ == '__main__':

     load_my_logging_cfg()

 #=============>core目录:存放核心逻辑

 #core.py

 import logging

 import time

 from conf import settings

 from lib import read_ini

 config=read_ini.read(settings.config_path)

 logger=logging.getLogger(__name__)

 current_user={'user':None,'login_time':None,'timeout':int(settings.user_timeout)}

 def auth(func):

     def wrapper(*args,**kwargs):

         if current_user['user']:

             interval=time.time()-current_user['login_time']

             if interval < current_user['timeout']:

                 return func(*args,**kwargs)

         name = input('name>>: ')

         password = input('password>>: ')

         if config.has_section(name):

             if password == config.get(name,'password'):

                 logger.info('登录成功')

                 current_user['user']=name

                 current_user['login_time']=time.time()

                 return func(*args,**kwargs)

         else:

             logger.error('用户名不存在')

     return wrapper

 @auth

 def buy():

     print('buy...')

 @auth

 def run():

     print('''

 购物

 查看余额

 转账

     ''')

     while True:

         choice = input('>>: ').strip()

         if not choice:continue

         if choice == '':

             buy()

 if __name__ == '__main__':

     run()

 #=============>db目录:存放数据库文件

 #alex_json

 #egon_json

 #=============>lib目录:存放自定义的模块与包

 #read_ini.py

 import configparser

 def read(config_file):

     config=configparser.ConfigParser()

     config.read(config_file)

     return config

 #=============>log目录:存放日志

 #all2.log

 [2017-07-29 00:31:40,272][MainThread:11692][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:31:41,789][MainThread:11692][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:31:46,394][MainThread:12348][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:31:47,629][MainThread:12348][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:31:57,912][MainThread:10528][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:32:03,340][MainThread:12744][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:32:05,065][MainThread:12916][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:32:08,181][MainThread:12916][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:32:13,638][MainThread:7220][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:32:23,005][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]

 [2017-07-29 00:32:40,941][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]

 [2017-07-29 00:32:47,222][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]

 [2017-07-29 00:32:51,949][MainThread:7220][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:33:00,213][MainThread:7220][task_id:core.core][core.py:20][INFO][登录成功]

 [2017-07-29 00:33:50,118][MainThread:8500][task_id:conf.my_log_settings][my_log_settings.py:75][INFO][It works!]

 [2017-07-29 00:33:55,845][MainThread:8500][task_id:core.core][core.py:20][INFO][登录成功]

 [2017-07-29 00:34:06,837][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:34:09,405][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在]

 [2017-07-29 00:34:10,645][MainThread:8500][task_id:core.core][core.py:25][ERROR][用户名不存在]

Python 3 软件开发规范的更多相关文章

  1. python中软件开发规范,模块,序列化随笔

    1.软件开发规范 首先: 当代码都存放在一个py文件中时会导致 1.不便于管理,修改,增加 2.可读性差 3.加载速度慢 划分文件1.启动文件(启动接口)--starts文件放bin文件里2.公共文件 ...

  2. Python模块的导入以及软件开发规范

    Python文件的两种用途 1 . 当脚本直接使用,直接当脚本运行调用即可 def func(): print("from func1") func() 2 . 当做模块被导入使用 ...

  3. python 全栈开发,Day29(昨日作业讲解,模块搜索路径,编译python文件,包以及包的import和from,软件开发规范)

    一.昨日作业讲解 先来回顾一下昨日的内容 1.os模块 和操作系统交互 工作目录 文件夹 文件 操作系统命令 路径相关的 2.模块 最本质的区别 import会创建一个专属于模块的名字, 所有导入模块 ...

  4. python(37)- 软件开发规范

    软件开发规范 一.为什么要设计好目录结构? 1.可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快速的了解这个项目. 2 ...

  5. Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型)

    Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型) 一丶软件开发规范 六个目录: #### 对某 ...

  6. Python 入门之 软件开发规范

    Python 入门之 软件开发规范 1.软件开发规范 -- 分文件 (1)为什么使用软件开发规范: 当几百行--大几万行代码存在于一个py文件中时存在的问题: 不便于管理 修改 可读性差 加载速度慢 ...

  7. python软件开发规范&分文件对于后期代码的高效管理

    根据本人的学习,按照理解整理和补充了python模块的相关知识,希望对于一些需要了解的python爱好者有帮助! 一.软件开发规范--分文件 当代码存在一个py文件中时: 1.不便于管理 (修改,增加 ...

  8. python27期day16:序列化、json、pickle、hashlib、collections、软件开发规范、作业。

    序列化模块:什么是序列化呢? 序列化的本质就是将一种数据结构(如字典.列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化.将这个字典直接写入文件是不可以的,必须转化成字符串的形式, ...

  9. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

随机推荐

  1. [ACM] HDU 5078 Osu!

    Osu! Problem Description Osu! is a very popular music game. Basically, it is a game about clicking. ...

  2. BNU 34990 Justice String (hash+二分求LCP)

    思路:枚举第一个字符串的位置,然后枚举最长公共前缀的长度,时间即会下降-- #pragma comment(linker, "/STACK:1024000000,1024000000&quo ...

  3. HDFS源码分析数据块复制选取复制源节点

    数据块的复制当然需要一个源数据节点,从其上拷贝数据块至目标数据节点.那么数据块复制是如何选取复制源节点的呢?本文我们将针对这一问题进行研究. 在BlockManager中,chooseSourceDa ...

  4. junit spring 测试

    http://my.oschina.net/dlpinghailinfeng/blog/336694 http://blog.csdn.net/zhangzikui/article/details/1 ...

  5. Windows server2008 搭建ASP接口訪问连接oracle数据库全过程记录

    真的是太不easy了,曾经的时候在window server 2003上面搭建了一套asp+oracle的接口系统.就费了好大的劲儿,事实上那会迷迷瞪瞪的也不知道怎么的就弄好了,也懒得管了.OK,从昨 ...

  6. PHP-Manual的学习----【入门指引】

    2017年6月27日17:03:53 笔记:简介    PHP是什么?    PHP能做什么?1.PHP("PHP: Hypertext Preprocessor",超文本预处理器 ...

  7. Lumen开发:lumen源码解读之初始化(2)——门面(Facades)与数据库(db)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 紧接上一篇 $app->withFacades();//为应用程序注册门面. $app->withEloquent();//为应用程序 ...

  8. 关于ES6的let,const与var之间的三生三世

    首先需要明确的是let.const.var都是用来定义变量的 在ES6之前,我们一般都用var来定义变量,例如 : function test(){ var i=1; console.log(i); ...

  9. Android源码下载之----内核需要另外下载

    用repo sync下载的android源码默认不包含kernel目录,需要自己另外下载. 下载命令:$ git clone https://android.googlesource.com/kern ...

  10. 仿照ArrayList自己生成的MyList对象

    现在需要自己生成一个list集合,基本雷同ArrayList,不使用API的List接口. 实现如下: MyList的代码: public class MyList<T> { privat ...