python之raise、assert、with/as环境管理器

要故意出发异常,可以使用raise语句,形式如下:

raise <name>  #manually trigger an exception

raise<name>,<value> #pass extra data to catcher too

raise  #re-raise the most recent excepti

第二种形式可以随着异常传递额外的数据,从而为处理器提供细节。

assert <test>,<data>  #<data>是可选项

if __debug__:

if not <test>:

raise AssertionError, <data>

在2.6及以后的版本中使用 with/as

with expression [as varible]:

with-block

在这里expression会返回一个对象,从而支持环境管理 协议。如果选用as分句,此对象也可返回一个值,赋值给变量名variable。

注意 :variable并非赋值为expression的结果。而varible则是赋值为其他的东西。然后,expression返回的对象可在with-block开始前,先执行启动程序,并且在该代码块完成后,执行中止程序代码,无论代码是否引发异常。

wiht open(r‘C:\python\scripts‘) as myfile:

[python] view plaincopy

  1. for line in myfile:
  2. print line
  3. line = line.repalce(‘spam‘,‘SPAM‘)
  4. ...MORE CODE HERE

with语句的实际工作方式:

1.计算表达式,所得到的对象是环境管理器,他必须有__enter__,__exit__两个方法。

2.环境管理器的__enter__方法会被调用。如果as存在,其返回值赋值给as后面的变量,否则,被丢弃。

3.代码块中嵌套的代码会执行。

4.如果with代码块会引发异常,__exit__(type,value,traceback)方法就会被调用。这些也是由
sys.exec_info返回相同的值。如果此方法返回为假,则异常会重新引发。否则,异常会中止。正常情况下异常是应该被重新引发,这样的话传递到
with语句外。

5.如果with代码块没有引发异常,__exit__方法依然会调用,其type、value以及traceback参数会以None传递。

with/as语句的设计,是为了让必须在程序代码块周围发生的启动和终止活动一定会发生。和try/finally语句(无论异常是否发生其离开动作都会执行)类似,但是with/as有更丰富的对象协议,可以定义进入和离开的动作。

python之raise、assert、with/as环境管理器,布布扣,bubuko.com

时间: 2024-10-29 19:05:56

python之raise、assert、with/as环境管理器的相关文章

【python3】raise,assert,nonlocal 关键字解读

raise Python 使用 raise 语句抛出一个指定的异常. raise语法格式如下: raise [Exception [, args [, traceback]]] try--finally try-finally 语句无论是否发生异常都将执行最后的代码. assert Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常. 断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如我们的代码只能在 Linu

Python中的网络扫描大杀器Scapy初探

Python中的网络扫描大杀器Scapy初探     最近经历了Twisted的打击,这个网络编程实在看不懂,都摸不透它的内在逻辑,看来网络编程不是那么好弄的.还好,看到了scapy,这种网络的大杀器,让我一看就爱不释手,这才是我需要的网络工具啊.Scapy的功能如此之多,以至于...我到现在还是没看懂.在官方网站也介绍的不多,后来搜了一下,有一本书Security Power Tools一书中,第六章介绍了Scapy,虽然简单,但是还是不明白,这两天一直在忙活着看Scapy.看了几个应用,比较

Python之命名空间、闭包、装饰器

一.命名空间 1. 命名空间 命名空间是一个字典,key是变量名(包括函数.模块.变量等),value是变量的值. 2. 命名空间的种类和查找顺序 - 局部命名空间:当前函数 - 全局命名空间:当前模块 - 内建命名空间:所有Python环境,所有模块 查找顺序 1.先在当前 (嵌套的或 lambda) 函数的命名空间中搜索 2.然后是在父函数的命名空间中搜索 3.接着是模块命名空间中搜索 4.最后在内置命名空间中搜索 要到内置命名空间都没找到的话,就会弹出NameError 这里看一个例子 i

python深入学习--decorator强大的装饰器

一.decorator基础. 最初接触python是在大学毕业进入某一游戏公司后,最开始觉得python不严谨,很不喜欢python这种"简单"的脚本,但是后来,越来越离不开python了,觉得这么灵活方便的语言,简直是程序员的福音,尤其是它的数据结构,他带来了一个"{}" 大括号就能搞定一切的时代.当然python还有很多优秀的特性.现在我们来讲python的特性之一--decorator(装饰器). 装饰器,顾名思义就是修饰函数或者类的,它把要装饰的函数作为参数

python中的函数式编程与装饰器

2.1 python中的函数式编程 函数式编码的特点 把计算视为函数而非指令 纯函数式编程,不需要变量,没有副作用,测试简单 支持高阶函数,代码简洁 python支持的函数式编程 不是纯函数式编码:允许有变量 支持高阶函数:函数也可以作为变量传入 支持闭包:有了闭包就能返回函数 有限度地支持匿名函数 2.2 python中高阶函数 函数名可以作为变量,如 高阶函数:只能接收函数作为参数的函数 变量可以是指向函数 函数的参数可以接收变量 一个函数可以接收另一个函数作为参数 能接收函数作为参数的函数

Python即时网络爬虫项目: 内容提取器的定义(Python2.7版本)

1. 项目背景 在Python即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间太多了(见上图),从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投入到更高端的数据处理工作中. 这个项目推出以后受到很大关注,因为开放源码,大家可以在现成源码基础上进一步开发.然而,Python3和Python2是有区别的,<Python即时网络爬虫项目: 内容提取器的定义> 一文的源码无法在Python2.7下使用,本文将发布一个Python2.7的内容提取器. 2.

【Todo】Python面试题分析记录(修饰器等)

首先,看这一段代码: class A(object): x = 1 gen = (lambda t: (t for _ in xrange(10)))(x) if __name__ == '__main__': print(list(A.gen)) 打印出: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 装饰器学习: 看这篇文章应该就可以了:<Python装饰器学习(九步入门)> 里面提到 http://www.cnblogs.com/huxi/archive/2011/03/

Python之面向对象:闭包和装饰器

一.闭包 1. 如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包. def outter(): name='python' def inner(): print name return inner res=outter() 把inner的地址赋值给res res() 相当于执行inner()函数.通过闭包,可以把局部变量在外部也可以使用 2.判断是否为闭包 res.func_closure inner()函数就是一个闭包 3.通过闭包,可以把局部变量在外部也可以

Blueprint的环境管理器

Blueprint Container 规范还定义了许多特殊的环境管理器,它们设置 ID 并提供对环境组件的访问.它们不具有 XML 定义,并且也不能被重写,因为它们的 ID 被保护起来,不能被其他管理器使用.环境管理器提供的对象只能被注入到使用引用的其他管理器中.Blueprint Container 规范定义了 4 种环境管理器: blueprintBundle 提供包的 Bundle(org.osgi.framework.Bundle) 对象. blueprintBundleContext