python:包与异常处理
一、包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那必须使用后者。 glance/
.py
│ ├── policy.py
│ └── versions.py ├── cmd <span style="color: #008000">#<span style="color: #008000">Subpackage for cmd<span style="color: #000000"> │ ├── <span style="color: #800080">init<span style="color: #000000">.py │ └── manage.py └── db <span style="color: #008000">#<span style="color: #008000">Subpackage for db<span style="color: #000000"> ├── <span style="color: #800080">init<span style="color: #000000">.py
目录结构 5,import 我们在与包glance同级别的文件中测试 1 2 glance.db.models.register_models()
6,from ... import ... 需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法 我们在与包glance同级别的文件中测试 : glance.db glance.db.models )
7,__init__.py文件 ?不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。 8,绝对导入和相对导入 最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式: 绝对导入:以glance作为起始 相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内) 例如:我们在glance/api/version.py中想要导入glance/cmd/manage.py 在glance/api/<span style="color: #008000">#<span style="color: #008000">绝对导入
<span style="color: #0000ff">from glance.cmd <span style="color: #0000ff">import<span style="color: #000000"> manage manage.main() <span style="color: #008000">#<span style="color: #008000">相对导入 ?特别需要注意的是:可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from... import ...的绝对或者相对导入,且包的相对导入只能用from的形式。 glance.api <span style="color: #800000">'''<span style="color: #800000">
执行结果: ImportError: No module named 'policy' <span style="color: #800000">''' <span style="color: #800000">'''<span style="color: #800000"> glance/├── <span style="color: #800080">init.py <span style="color: #0000ff">from glance <span style="color: #0000ff">import<span style="color: #000000"> api
<span style="color: #0000ff">from glance <span style="color: #0000ff">import<span style="color: #000000"> cmd <span style="color: #0000ff">from glance <span style="color: #0000ff">import<span style="color: #000000"> db ├── api │ ├── <span style="color: #800080">init.py <span style="color: #0000ff">from glance.api <span style="color: #0000ff">import<span style="color: #000000"> policy │ ├── policy.py │ └── versions.py ├── cmd <span style="color: #0000ff">from glance.cmd <span style="color: #0000ff">import<span style="color: #000000"> manage │ ├── <span style="color: #800080">init<span style="color: #000000">.py │ └── manage.py └── db <span style="color: #0000ff">from glance.db <span style="color: #0000ff">import<span style="color: #000000"> models
绝对导入 glance/├── <span style="color: #800080">init.py <span style="color: #0000ff">from . <span style="color: #0000ff">import api <span style="color: #008000">#<span style="color: #008000">.表示当前目录
<span style="color: #0000ff">from . <span style="color: #0000ff">import<span style="color: #000000"> cmd <span style="color: #0000ff">from . <span style="color: #0000ff">import<span style="color: #000000"> db ├── api │ ├── <span style="color: #800080">init.py <span style="color: #0000ff">from . <span style="color: #0000ff">import<span style="color: #000000"> policy │ ├── policy.py │ └── versions.py ├── cmd <span style="color: #0000ff">from . <span style="color: #0000ff">import<span style="color: #000000"> manage │ ├── <span style="color: #800080">init<span style="color: #000000">.py │ └── manage.py <span style="color: #0000ff">from ..api <span style="color: #0000ff">import<span style="color: #000000"> policy
相对导入 9,单独导入包 1
2 . 3
4
5 . manage
10,软件开发规范 bin目录:存放执行脚本
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(<span style="color: #800080">file<span style="color: #000000">)))
sys.path.append(BASE_DIR) <span style="color: #0000ff">from core <span style="color: #0000ff">import<span style="color: #000000"> core <span style="color: #0000ff">from conf <span style="color: #0000ff">import<span style="color: #000000"> my_log_settings <span style="color: #0000ff">if <span style="color: #800080">name == <span style="color: #800000">'<span style="color: #800000">main<span style="color: #800000">'<span style="color: #000000">: <span style="color: #008000">#<span style="color: #008000">=============>conf目录:存放配置文件<span style="color: #008000"> <span style="color: #008000">config.ini<span style="color: #000000">[DEFAULT] [egon] [alex] [yuanhao] <span style="color: #008000">#<span style="color: #008000">settings.py <span style="color: #008000">#<span style="color: #008000">my_log_settings.py <span style="color: #0000ff">import<span style="color: #000000"> os <span style="color: #008000">#<span style="color: #008000"> 定义三种日志输出格式 开始 id_simple_format = <span style="color: #800000">'<span style="color: #800000">[%(levelname)s][%(asctime)s] %(message)s<span style="color: #800000">' <span style="color: #008000">#<span style="color: #008000"> 定义日志输出格式 结束 <span style="color: #008000">#<span style="color: #008000"> 如果不存在定义的日志目录就创建一个 <span style="color: #008000">#<span style="color: #008000"> log文件的全路径 <span style="color: #008000">#<span style="color: #008000"> log配置字典 <span style="color: #0000ff">def<span style="color: #000000"> load_my_logging_cfg(): <span style="color: #0000ff">if <span style="color: #800080">name == <span style="color: #800000">'<span style="color: #800000">main<span style="color: #800000">'<span style="color: #000000">: <span style="color: #008000">#<span style="color: #008000">=============>core目录:存放核心逻辑<span style="color: #008000"> <span style="color: #008000">core.py<span style="color: #0000ff">import<span style="color: #000000"> logging config=<span style="color: #000000">read_ini.read(settings.config_path) current_user={<span style="color: #800000">'<span style="color: #800000">user<span style="color: #800000">':None,<span style="color: #800000">'<span style="color: #800000">login_time<span style="color: #800000">':None,<span style="color: #800000">'<span style="color: #800000">timeout<span style="color: #800000">'<span style="color: #000000">:int(settings.user_timeout)}
@auth @auth
购物 <span style="color: #0000ff">if <span style="color: #800080">name == <span style="color: #800000">'<span style="color: #800000">main<span style="color: #800000">'<span style="color: #000000">: <span style="color: #008000">#<span style="color: #008000">=============>db目录:存放数据库文件<span style="color: #008000"> <span style="color: #008000">alex_json<span style="color: #008000"><span style="color: #008000">egon_json<span style="color: #008000">#<span style="color: #008000">=============>lib目录:存放自定义的模块与包<span style="color: #008000"> <span style="color: #008000">read_ini.py<span style="color: #0000ff">import<span style="color: #000000"> configparser <span style="color: #008000">#<span style="color: #008000">=============>log目录:存放日志<span style="color: #008000"> <span style="color: #008000">all2.log[2017-07-29 00:31:40,272][MainThread:11692][task_id:conf.my_log_settings][my_log_settings.py:75<span style="color: #000000">][INFO][It works!] 二、异常处理 1,程序中难免出现错误,而错误分成两种: 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) <span style="color: #008000"># <span style="color: #008000">语法错误示范二<span style="color: #0000ff">def<span style="color: #000000"> test: <span style="color: #0000ff">pass <span style="color: #008000">#<span style="color: #008000">语法错误示范三 语法错误 2.逻辑错误(逻辑错误)
num=input(>: <span style="color: #008000">#<span style="color: #008000">无法完成计算
res1=1/<span style="color: #000000">0 res2=1+<span style="color: #800000">'<span style="color: #800000">str<span style="color: #800000">' 2,什么是异常 异常就是程序运行时发生错误的信号
3,python中的异常种类 在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误
l=[,3]
dic={:]
s=
4,常用异常 /5+常用异常
5,更多异常 更多异常
三、异常处理1,什么是异常? 异常发生之后 异常之后的代码就不执行了 2,什么是异常处理 python解释器检测到错误,触发异常(也允许程序员自己触发异常) 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关) 如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理 3,如何进行异常处理? 首先须知,异常是由程序的错误引起的,语法上的错误跟异常处理无关,必须在程序运行前就修正 一: 使用if判断式正常的计划: num1=input(>: )
int(num1)
= num1=input(<span style="color: #800000">'<span style="color: #800000">>>: <span style="color: #800000">') <span style="color: #008000">#<span style="color: #008000">输入一个字符串试试
<span style="color: #0000ff">if<span style="color: #000000"> num1.isdigit(): int(num1) <span style="color: #008000">#<span style="color: #008000">我们的正统程序放到了这里,其余的都属于异常处理范畴 <span style="color: #0000ff">elif<span style="color: #000000"> num1.isspace(): <span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">输入的是空格,就执行我这里的逻辑<span style="color: #800000">'<span style="color: #000000">) <span style="color: #0000ff">elif len(num1) ==<span style="color: #000000"> 0: <span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">输入的是空,就执行我这里的逻辑<span style="color: #800000">'<span style="color: #000000">) <span style="color: #0000ff">else<span style="color: #000000">: <span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">其他情情况,执行我这里的逻辑<span style="color: #800000">'<span style="color: #000000">) <span style="color: #800000">'''<span style="color: #800000"> 问题二: 使用if判断进行异常处理 总结: 1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。 2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差 3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。 二:python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理part1:基本语法try:
被检测的代码块
except 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑
f = open(g = (line.strip() <span style="color: #0000ff">for line <span style="color: #0000ff">in<span style="color: #000000"> f)
<span style="color: #0000ff">for line <span style="color: #0000ff">in<span style="color: #000000"> g: <span style="color: #0000ff">print<span style="color: #000000">(line) <span style="color: #0000ff">else<span style="color: #000000">: f.close() = open(= (line.strip() line <span style="color: #800000">'''<span style="color: #800000">
next(g)会触发迭代f,依次next(g)就可以读取文件的一行行内容,无论文件a.txt有多大,同一时刻内存中只有一行内容。 提示:g是基于文件句柄f而存在的,因而只能在next(g)抛出异常StopIteration后才可以执行f.close() <span style="color: #800000">'''<span style="color: #000000"> part2:异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
=
e
part3:多分支s1 =
(e)
part4:万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任意异常,即:s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e)
为什么不直接用万能异常?分两种情况去看: 1.如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么骚年,大胆的去做吧,只有一个Exception就足够了。 s1 =
<span style="color: #008000">#<span style="color: #008000">如果你统一用Exception,没错,是可以捕捉所有异常,但意味着你在处理所有异常时都使用同一个逻辑去处理(这里说的逻辑即当前expect下面跟的代码块)
<span style="color: #000000"> Exception 2.如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。
s1 =
(e)
s1 =
(e)
part5:异常的其他机构s1 =
(()
part6:主动触发异常try:
raise TypeError('类型错误')
except Exception as e:
print(e)
part7:自定义异常class EvaException(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msg part8:try..except的方式比较if的方式的好处try..except这种异常处理机制就是取代if那种方式,让你的程序在不牺牲可读性的前提下增强健壮性和容错性 异常处理中为每一个异常定制了异常类型(python中统一了类与类型,类型即类),对于同一种异常,一个except就可以捕捉到,可以同时处理多段代码的异常(无需‘写多个if判断式’)减少了代码,增强了可读性? 使用try..except的方式 1:把错误处理和真正的工作分开来2:代码更易组织,更清晰,复杂的工作任务更容易实现;3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |