文本夹是用来组合py文件(包的真相就是一个分包,把解决一类难点的模块放在同一个文件夹里—–包 澳门永利平台娱乐

把解决一类问题的模块放在同一个文件夹里—–包 ,把解决一类问题的模块放在同一个文件夹里—–包 

一、包

1,什么是包?

把解决一类难题的模块放在同一个文件夹里—–包 

2,包是一种通过运用‘.模块名’来协会python模块名称空间的方法。

  1.
无论import格局仍旧from…import格局,凡是在导入语句中(而不是在利用时)碰到带点的,都要第一时间提升警觉:那是有关包才有的导入语法

  2.
包是目录级的(文件夹级),文件夹是用来组合py文件(包的本来面目就是一个含有__init__.py文件的目录)

  3. import导入文本时,爆发名称空间中的名字源于文件,import
包,爆发的称谓空间的名字同样来自文件,即包下的__init__.py,导入包本质就是在导入该公文

3,强调:

  1. 在python3中,纵然包下没有__init__澳门永利平台娱乐,.py文件,import
包仍旧不会报错,而在python2中,包下一定要有该公文,否则import 包报错

  2.
开立包的目的不是为了运行,而是被导入使用,包只是模块的一种格局而已,包即模块

 4,注意事项

  1.有关包相关的导入语句也分为import和from … import
…两种,不过不管哪个种类,无论在怎么岗位,在导入时都必须根据一个标准:凡是在导入时带点的,点的左手都不可以不是一个包,否则不合法。可以涵盖三番五次串的点,如item.subitem.subsubitem,但都无法不坚守那几个原则。

  2.对此导入后,在使用时就从不那种限制了,点的左侧可以是包,模块,函数,类(它们都得以用点的不二法门调用自个儿的习性)。

  3.比较import item 和from item import name的行使场景:
  借使我们想直接行使name那必须采纳后者。

澳门永利平台娱乐 1澳门永利平台娱乐 2

glance/                   #Top-level package

├── __init__.py      #Initialize the glance package

├── api                  #Subpackage for api

│   ├── __init__.py

│   ├── policy.py

│   └── versions.py

├── cmd                #Subpackage for cmd

│   ├── __init__.py

│   └── manage.py

└── db                  #Subpackage for db

    ├── __init__.py

    └── models.py

目录结构

目录结构

 

5,import

我们在与包glance同级其他文书中测试

1 import glance.db.models
2 glance.db.models.register_models('mysql') 

6,from … import …

亟待专注的是from后import导入的模块,必须是了然的一个无法带点,否则会有语法错误,如:from
a import b.c是大错特错语法

大家在与包glance同级其余文件中测试 :

from glance.db import models
models.register_models('mysql')
from glance.db.models import register_models
register_models('mysql')

7,__init__.py文件

 不管是哪类办法,只若是率先次导入包依然是包的其它其他一些,都会挨个执行包下的__init__.py文件(大家得以在各个包的文件内都打印一行内容来证澳优(Ausnutria Hyproca)下),那些文件可以为空,可是也足以存放一些伊始化包的代码。

8,相对导入和对立导入

最超级包glance是写给外人用的,然后在glance包内部也会有互相之间相互导入的须求,这时候就有相对导入和相对导入二种艺术:

纯属导入:以glance作为开局

相持导入:用.或然..的方法最好开端(只好在一个包中使用,不大概用来不一致目录内)

例如:大家在glance/api/version.py中想要导入glance/cmd/manage.py

在glance/api/version.py

#绝对导入
from glance.cmd import manage
manage.main()

#相对导入
from ..cmd import manage
manage.main()

 专程要求注意的是:可以用import导入内置或然第三方模块(已经在sys.path中),但是要相对防止选择import来导入自定义包的子模块(没有在sys.path中),应该利用from…
import …的相对大概相对导入,且包的相对导入只可以用from的款型。

from glance.api import versions

'''
执行结果:
ImportError: No module named 'policy'
'''

'''
分析:
此时我们导入versions在versions.py中执行
import policy需要找从sys.path也就是从当前目录找policy.py,
这必然是找不到的
'''

澳门永利平台娱乐 3澳门永利平台娱乐 4

glance/                   

├── __init__.py      from glance import api
                             from glance import cmd
                             from glance import db

├── api                  

│   ├── __init__.py  from glance.api import policy
                              from glance.api import versions

│   ├── policy.py

│   └── versions.py

├── cmd                 from glance.cmd import manage

│   ├── __init__.py

│   └── manage.py

└── db                   from glance.db import models

    ├── __init__.py

    └── models.py

绝对导入

纯属导入

澳门永利平台娱乐 5澳门永利平台娱乐 6

glance/                   

├── __init__.py      from . import api  #.表示当前目录
                     from . import cmd
                     from . import db

├── api                  

│   ├── __init__.py  from . import policy
                     from . import versions

│   ├── policy.py

│   └── versions.py

├── cmd              from . import manage

│   ├── __init__.py

│   └── manage.py    from ..api import policy   
                     #..表示上一级目录,想再manage中使用policy中的方法就需要回到上一级glance目录往下找api包,从api导入policy

└── db               from . import models

    ├── __init__.py

    └── models.py

相对导入

相对导入

9,单独导入包

1 #glance/__init__.py
2 from . import cmd
3 
4 #glance/cmd/__init__.py
5 from . import manage

10,软件开发规范

澳门永利平台娱乐 7

澳门永利平台娱乐 8澳门永利平台娱乐 9

#=============>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 == '1':
            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][用户名不存在]

View Code

二、至极处理

1,程序中难免出现谬误,而不当分成二种:

  1.语法错误(那种颠倒是非,根本过不了python解释器的语法检测,必须在程序执行前就校对)

澳门永利平台娱乐 10澳门永利平台娱乐 11

#语法错误示范一
if

#语法错误示范二
def test:
    pass

#语法错误示范三
print(haha

语法错误

语法错误

  2.逻辑错误(逻辑错误)

澳门永利平台娱乐 12澳门永利平台娱乐 13

#用户输入不完整(比如输入为空)或者输入非法(输入不是数字)
num=input(">>: ")
int(num)

#无法完成计算
res1=1/0
res2=1+'str'

逻辑错误

2,什么是那多少个

可怜就是程序运行时爆发错误的信号

  澳门永利平台娱乐 14

3,python中的极度种类

 在python中差其他那么些可以用不相同的门类(python中集合了类与品类,类型即类)去标识,区其余类对象标识差其余可怜,一个相当标识一种错误

  

澳门永利平台娱乐 15澳门永利平台娱乐 16

l=['egon','aa']
l[3]

Index Error

澳门永利平台娱乐 17澳门永利平台娱乐 18

dic={'name':'egon'}
dic['age']

Key Error

澳门永利平台娱乐 19澳门永利平台娱乐 20

s='hello'
int(s)

Value Error

4,常用分外

澳门永利平台娱乐 21澳门永利平台娱乐 22

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

常用异常

常用万分

5,越来越多特别

澳门永利平台娱乐 23澳门永利平台娱乐 24

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

更多异常

更加多可怜

python:包与丰富处理,python:包相当处理

三、相当处理

1,怎样是尤其?

格外发生未来

老大之后的代码就不执行了

2,什么是不行处理

python解释器检测到不当,触发非常(也同意程序员自个儿触发相当)

程序员编写特定的代码,专门用来捕捉那么些特别(那段代码与程序逻辑毫不相关,与那一个处理有关)

即使捕捉成功则跻身其它一个拍卖分支,执行你为其定制的逻辑,使程序不会崩溃,那就是分外处理

3,怎么着开展充足处理?

率先须知,非常是由程序的荒谬引起的,语法上的一无所能跟这几个处理非亲非故,必须在程序运行前就更正

一、包

1,什么是包?

把化解一类标题标模块放在同一个文书夹里—–包 

2,包是一种通过应用‘.模块名’来公司python模块名称空间的措施。

  1.
不管import方式仍旧from…import格局,凡是在导入语句中(而不是在选择时)碰到带点的,都要第一时间升高警惕:那是有关包才有的导入语法

  2.
包是目录级的(文件夹级),文件夹是用来组成py文件(包的原形就是一个带有__init__.py文件的目录)

  3. import导入文本时,暴发名称空间中的名字源于文件,import
包,发生的名号空间的名字如出一辙来自文件,即包下的__init__.py,导入包本质就是在导入该公文

3,强调:

  1. 在python3中,即使包下没有__init__.py文件,import
包仍旧不会报错,而在python2中,包下一定要有该公文,否则import 包报错

  2.
创办包的目标不是为了运行,而是被导入使用,包只是模块的一种情势而已,包即模块

 4,注意事项

  1.关于包相关的导入语句也分为import和from … import
…二种,但是不论哪个种类,无论在如何岗位,在导入时都不能够不按照一个尺度:凡是在导入时带点的,点的左手都无法不是一个包,否则不合规。可以涵盖一而再串的点,如item.subitem.subsubitem,但都无法不比照那些规格。

  2.对此导入后,在接纳时就从未那种限制了,点的左手可以是包,模块,函数,类(它们都足以用点的法子调用本人的天性)。

  3.相比较import item 和from item import name的利用场景:
  如若大家想一贯利用name那必须选用后者。

澳门永利平台娱乐 25

glance/                   #Top-level package

├── __init__.py      #Initialize the glance package

├── api                  #Subpackage for api

│   ├── __init__.py

│   ├── policy.py

│   └── versions.py

├── cmd                #Subpackage for cmd

│   ├── __init__.py

│   └── manage.py

└── db                  #Subpackage for db

    ├── __init__.py

    └── models.py

目录结构

目录结构

 

5,import

咱俩在与包glance同级其他文件中测试

1 import glance.db.models
2 glance.db.models.register_models('mysql') 

6,from … import …

亟待专注的是from后import导入的模块,必须是明白的一个无法带点,否则会有语法错误,如:from
a import b.c是大错特错语法

我们在与包glance同级其余文书中测试 :

from glance.db import models
models.register_models('mysql')
from glance.db.models import register_models
register_models('mysql')

7,__init__.py文件

 不管是哪一类办法,只假若率先次导入包仍旧是包的其余其余部分,都会挨个执行包下的__init__.py文件(大家得以在各种包的公文内都打印一行内容来证Bellamy下),这些文件可以为空,不过也得以存放一些开始化包的代码。

8,相对导入和周旋导入

最一级包glance是写给外人用的,然后在glance包内部也会有相互之间互相导入的须求,那时候就有相对导入和相持导入三种方式:

相对导入:以glance作为开局

周旋导入:用.大概..的办法最好发轫(只能在一个包中使用,不可以用来不相同目录内)

例如:大家在glance/api/version.py中想要导入glance/cmd/manage.py

在glance/api/version.py

#绝对导入
from glance.cmd import manage
manage.main()

#相对导入
from ..cmd import manage
manage.main()

 专程须求专注的是:可以用import导入内置可能第三方模块(已经在sys.path中),但是要相对防止选择import来导入自定义包的子模块(没有在sys.path中),应该选择from…
import …的相对或许相对导入,且包的周旋导入只可以用from的款型。

from glance.api import versions

'''
执行结果:
ImportError: No module named 'policy'
'''

'''
分析:
此时我们导入versions在versions.py中执行
import policy需要找从sys.path也就是从当前目录找policy.py,
这必然是找不到的
'''

澳门永利平台娱乐 26

glance/                   

├── __init__.py      from glance import api
                             from glance import cmd
                             from glance import db

├── api                  

│   ├── __init__.py  from glance.api import policy
                              from glance.api import versions

│   ├── policy.py

│   └── versions.py

├── cmd                 from glance.cmd import manage

│   ├── __init__.py

│   └── manage.py

└── db                   from glance.db import models

    ├── __init__.py

    └── models.py

绝对导入

相对导入
澳门永利平台娱乐 27

glance/                   

├── __init__.py      from . import api  #.表示当前目录
                     from . import cmd
                     from . import db

├── api                  

│   ├── __init__.py  from . import policy
                     from . import versions

│   ├── policy.py

│   └── versions.py

├── cmd              from . import manage

│   ├── __init__.py

│   └── manage.py    from ..api import policy   
                     #..表示上一级目录,想再manage中使用policy中的方法就需要回到上一级glance目录往下找api包,从api导入policy

└── db               from . import models

    ├── __init__.py

    └── models.py

相对导入

对立导入

9,单独导入包

1 #glance/__init__.py
2 from . import cmd
3 
4 #glance/cmd/__init__.py
5 from . import manage

10,软件开发规范

澳门永利平台娱乐 28

澳门永利平台娱乐 29

#=============>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 == '1':
            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][用户名不存在]

View Code

二、相当处理

1,程序中难免出现错误,而不当分成三种:

  1.语法错误(那种破绽百出,根本过不了python解释器的语法检测,必须在程序执行前就改进)

澳门永利平台娱乐 30

#语法错误示范一
if

#语法错误示范二
def test:
    pass

#语法错误示范三
print(haha

语法错误

语法错误

  2.逻辑错误(逻辑错误)

澳门永利平台娱乐 31

#用户输入不完整(比如输入为空)或者输入非法(输入不是数字)
num=input(">>: ")
int(num)

#无法完成计算
res1=1/0
res2=1+'str'

逻辑错误

2,什么是可怜

分外就是程序运行时暴发错误的信号

  澳门永利平台娱乐 32

3,python中的至极种类

 在python中分歧的足够可以用分化的系列(python中集合了类与项目,类型即类)去标识,区其他类对象标识差别的要命,一个至极标识一种错误

  

澳门永利平台娱乐 33

l=['egon','aa']
l[3]

Index Error
澳门永利平台娱乐 34

dic={'name':'egon'}
dic['age']

Key Error
澳门永利平台娱乐 35

s='hello'
int(s)

Value Error

4,常用非常

澳门永利平台娱乐 36

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

常用异常

常用卓殊

5,更加多卓殊

澳门永利平台娱乐 37

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

更多异常

越来越多可怜

一: 使用if判断式

常规的安顿:

num1=input('>>: ') #输入一个字符串试试
int(num1)

澳门永利平台娱乐 38澳门永利平台娱乐 39

#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'

num1=input('>>: ') #输入一个字符串试试
if num1.isdigit():
    int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴
elif num1.isspace():
    print('输入的是空格,就执行我这里的逻辑')
elif len(num1) == 0:
    print('输入的是空,就执行我这里的逻辑')
else:
    print('其他情情况,执行我这里的逻辑')

'''
问题一:
使用if的方式我们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并无关系,这样你的代码会因为可读性差而不容易被看懂

问题二:
这只是我们代码中的一个小逻辑,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。
'''

使用if判断进行异常处理

运用if判断举行充裕处理

总结:

1.if判断式的不行处理只好针对某一段代码,对于不一致的代码段的均等档次的错误你须求写重复的if来拓展处理。

2.在您的主次中反复的写与程序自身非亲非故,与越发处理有关的if,会使得你的代码可读性极其的差

3.if是足以缓解这么些的,只是存在1,2的标题,所以,千万不要妄下定论if无法用来充裕处理。

三、格外处理

1,什么样是那一个?

可怜暴发之后

极度之后的代码就不实施了

2,什么是突出处理

python解释器检测到不当,触发非常(也允许程序员自个儿触发非凡)

程序员编写特定的代码,专门用来捕捉那几个相当(那段代码与程序逻辑毫不相关,与尤其处理有关)

假定捕捉成功则跻身此外一个甩卖分支,执行你为其定制的逻辑,使程序不会崩溃,那就是那几个处理

3,如何进行非凡处理?

率先须知,非常是由程序的谬误引起的,语法上的荒谬跟那么些处理毫不相关,必须在程序运行前就勘误

二:python为每种万分定制了一个连串,然后提供了一种特定的语法结构用来进展充裕处理

一: 使用if判断式

健康的布署:

num1=input('>>: ') #输入一个字符串试试
int(num1)

澳门永利平台娱乐 40

#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'

num1=input('>>: ') #输入一个字符串试试
if num1.isdigit():
    int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴
elif num1.isspace():
    print('输入的是空格,就执行我这里的逻辑')
elif len(num1) == 0:
    print('输入的是空,就执行我这里的逻辑')
else:
    print('其他情情况,执行我这里的逻辑')

'''
问题一:
使用if的方式我们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并无关系,这样你的代码会因为可读性差而不容易被看懂

问题二:
这只是我们代码中的一个小逻辑,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。
'''

使用if判断进行异常处理

行使if判断举行尤其处理

总结:

1.if判断式的卓殊处理只好针对某一段代码,对于差其余代码段的同一种类的一无所能你必要写重复的if来进展拍卖。

2.在您的程序中反复的写与程序自身毫无干系,与尤其处理有关的if,会使得你的代码可读性极其的差

3.if是可以缓解那一个的,只是存在1,2的题材,所以,千万不要妄下定论if不可以用来万分处理。

part1:基本语法

try:
     被检测的代码块
except 异常类型:
     try中一旦检测到异常,就执行这个位置的逻辑

澳门永利平台娱乐 41澳门永利平台娱乐 42

f = open('a.txt')

g = (line.strip() for line in f)
for line in g:
    print(line)
else:
    f.close()

读文件例1

澳门永利平台娱乐 43读文件例2

二:python为各种非凡定制了一个连串,然后提供了一种特定的语法结构用来展开特别处理

part2:十分类只可以用来处理指定的非凡处境,即使非指定尤其则无法处理。

# 未捕获到异常,程序直接报错

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print e

part1:基本语法

try:
     被检测的代码块
except 异常类型:
     try中一旦检测到异常,就执行这个位置的逻辑

澳门永利平台娱乐 44

f = open('a.txt')

g = (line.strip() for line in f)
for line in g:
    print(line)
else:
    f.close()

读文件例1
澳门永利平台娱乐 45读文件例2

part3:多分支

s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)

part2:相当类只好用来处理指定的相当情形,假使非指定尤其则无从处理。

# 未捕获到异常,程序直接报错

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print e

part4:万能充足 在python的万分中,有一个万能可怜:Exception,他得以捕获任意十分,即:

s1 = 'hello'
try:
    int(s1)
except Exception as e:
    print(e)

怎么不直接用万能可怜?分二种景况去看:

1.倘诺您想要的职能是,无论出现哪些很是,大家联合屏弃,恐怕应用相同段代码逻辑去处理他们,那么骚年,大胆的去做啊,唯有一个Exception就足足了。

s1 = 'hello'
try:
    int(s1)
except Exception,e:
    '丢弃或者执行其他逻辑'
    print(e)

#如果你统一用Exception,没错,是可以捕捉所有异常,但意味着你在处理所有异常时都使用同一个逻辑去处理(这里说的逻辑即当前expect下面跟的代码块)

Exception

2.假若您想要的效益是,对于不一样的老大大家要求定制区其余处理逻辑,那就需求用到多分支了。

澳门永利平台娱乐 46澳门永利平台娱乐 47

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)

 多分支

多分支

澳门永利平台娱乐 48多分支+Exception

part3:多分支

s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)

part5:非凡的任何单位

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
#except Exception as e:
#    print(e)
else:
    print('try内代码块没有异常则执行我')
finally:
    print('无论异常与否,都会执行该模块,通常是进行清理工作')

part4:万能可怜 在python的特别中,有一个万能极度:Exception,他得以捕获任意万分,即:

s1 = 'hello'
try:
    int(s1)
except Exception as e:
    print(e)

缘何不直接用万能相当?分三种意况去看:

1.比方你想要的效益是,无论出现什么样尤其,我们联合扬弃,或然应用相同段代码逻辑去处理他们,那么骚年,大胆的去做啊,唯有一个Exception就足足了。

s1 = 'hello'
try:
    int(s1)
except Exception,e:
    '丢弃或者执行其他逻辑'
    print(e)

#如果你统一用Exception,没错,是可以捕捉所有异常,但意味着你在处理所有异常时都使用同一个逻辑去处理(这里说的逻辑即当前expect下面跟的代码块)

Exception

2.假诺您想要的成效是,对于差别的万分大家要求定制差距的处理逻辑,那就需求用到多分支了。

澳门永利平台娱乐 49

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)

 多分支

多分支
澳门永利平台娱乐 50多分支+Exception

part6:主动触发非凡

try:
    raise TypeError('类型错误')
except Exception as e:
    print(e)

part5:万分的别样机关

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
#except Exception as e:
#    print(e)
else:
    print('try内代码块没有异常则执行我')
finally:
    print('无论异常与否,都会执行该模块,通常是进行清理工作')

part7:自定义非凡

澳门永利平台娱乐 51

class EvaException(BaseException):
    def __init__(self,msg):
        self.msg=msg
    def __str__(self):
        return self.msg

try:
    raise EvaException('类型错误')
except EvaException as e:
    print(e)

part6:主动触发相当

try:
    raise TypeError('类型错误')
except Exception as e:
    print(e)

part8:try..except的点子相比if的主意的利益

try..except那种尤其处理体制就是代表if这种办法,让您的次第在不就义可读性的前提下增进健壮性和容错性

格外处理中为逐个可怜定制了丰硕类型(python中联合了类与连串,类型即类),对于同样种尤其,一个except就可以捕捉到,可以同时处理多段代码的可怜(无需‘写八个if判断式’)裁减了代码,增强了可读性 

 

使用try..except的方式

1:把错误处理和确实的劳作分别来
2:代码更易协会,更清楚,复杂的行事任务更易于落成;
3:毫无疑问,更安全了,不至于由于部分小的疏忽而使程序竟然崩溃了;

 

part7:自定义万分

澳门永利平台娱乐 52

class EvaException(BaseException):
    def __init__(self,msg):
        self.msg=msg
    def __str__(self):
        return self.msg

try:
    raise EvaException('类型错误')
except EvaException as e:
    print(e)

part8:try..except的法门比较if的法门的好处

try..except那种尤其处理体制就是代表if这种形式,让您的顺序在不就义可读性的前提下抓实健壮性和容错性

丰硕处理中为每种卓殊定制了足够类型(python中联合了类与类型,类型即类),对于同样种尤其,一个except就足以捕捉到,可以同时处理多段代码的尤其(无需‘写多个if判断式’)裁减了代码,增强了可读性 

 

使用try..except的方式

1:把错误处理和确实的做事分别来
2:代码更易协会,更清楚,复杂的劳作职责更便于完结;
3:毫无疑问,更安全了,不至于由于有的小的大意而使程序竟然崩溃了;

 

http://www.bkjia.com/Pythonjc/1284237.htmlwww.bkjia.comtruehttp://www.bkjia.com/Pythonjc/1284237.htmlTechArticlepython:包与异常处理,python:包异常处理 一、包
1,什么是包? 把搞定一类标题标模块放在同一个文本夹里—–包
2,包是一种通过采纳‘.模…