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. 3、Linux内核模块学习

    一.内核模块的学习   内核的整体框架是非常的大,包含的组件也是非常多,如何将需要的组件包含在内核中呢?选择一,就是将所有的组件全部编译进内核,虽然需要的组件都可以使用,但是内核过分庞大,势必带来效率 ...

  2. VBA小功能集合-判断列内是否有重复值

    1.判断列内是否有重复值: Dim arrT As Range Dim rng As Range Set arrT = Range("A:A")'判读A列单元格 For Each ...

  3. Android的View 事件传递

    欢迎转载,请附出处: http://blog.csdn.net/as02446418/article/details/47422891 1.基础知识 (1) 全部 Touch 事件都被封装成了 Mot ...

  4. intelligent_cam

    https://github.com/shengkaisun/intelligent_cam/tree/772fe0e4d315f83ba01134389c6b618b1ce40aaf intelli ...

  5. mysql 归档方案(一次性)

    一. 归档流程: 1. 导出需要的数据 2. 创建临时表table_tmp 3. 导入数据到临时表 4. 修改原始表名为table_bak 5. 修改临时表为原始表名 二.归档方式对比 1. sele ...

  6. git add . git add -u git add -A命令区别图解

    git版本不同会有所区别: Git Version 1.x:  Git Version 2.x:  git add .  修改(modified)以及新文件(new),但不包括被删除的文件. git ...

  7. publish over ssh 实现 Jenkins 远程部署

    Jenkins远程部署,一开始没有任何头绪,想了很多方案. 因为两台机器都是windows系统,所以想到publish over cifs, 但是这个网上资料太少,貌似只能内网使用.又想到了Jenki ...

  8. 通俗的解释下音视频同步里pcr作用

    PCR同步在非硬件精确时钟源的情况还是谨慎使用,gstreamer里面采用PCR同步,但是发现好多ffmpeg转的片儿,或者是CP方的片源,pcr打得很粗糙的,老是有跳帧等现象.音视频同步,有三种方法 ...

  9. 为什么 java wait/notify 必须与 synchronized 一起使用,jvm究竟做了些什么

    这个课题提出来的是原先的线程并发解决的思路.目前解决线程并发,可以是lock接口结合condition  并发问题一直以来就是线程必不可少的话题. java 是第一个内置对多线程支持的主流编程语言.在 ...

  10. 【文献阅读】Deep Residual Learning for Image Recognition--CVPR--2016

    最近准备用Resnet来解决问题,于是重读Resnet的paper <Deep Residual Learning for Image Recognition>, 这是何恺明在2016-C ...