with在python中的用法和含义

With语句的基本语法格式:

"""
格式
with expression [as target]:
	with_body
"""

参数说明:
expression:是一个需要执行的表达式;
target:是一个变量或者元组,存储的是expression表达式执行返回的结果,可选参数。

with open('1.txt') as f:
    print(f.read())
    
print(f.closed)

在with语句块中就可以使用这个变量操作文件,执行with这个结构之后,f会自动关闭,相当于自带了一个finally。但是with本身并没有异常捕获的功能,但是如果发生了运行时异常,它照样可以关闭文件释放资源。

为了我们自己的类也可以使用with, 只要给这个类增加两个函数__enter__, __exit__即可:

object.enter(self)
进入与此对象相关的运行时上下文。with语句将将此方法的返回值绑定到语句的AS子句中指定的目标(如果有设置的话)
object.exit(self, exc_type, exc_value, traceback)
退出与此对象相关的运行时上下文。参数描述导致上下文退出的异常。如果上下文运行时没有异常发生,那么三个参数都将置为None。
如果有异常发生,并且该方法希望抑制异常(即阻止它被传播),则它应该返回True。否则,异常将在退出该方法时正常处理。
请注意, exit()方法不应该重新抛出传入的异常,这是调用者的职责。

class A:
	def __enter__(self):
		print 'in enter'
	def __exit__(self, e_t, e_v, t_b):
		print 'in exit'
 
with A() as a:
	print 'in with'

一般访问文件资源时:

f = open('1.txt', 'r')
data = f.read()
f.close()
f = open('1.txt', 'r')
try:
    data = f.read()
finally:
    f.close()

但使用with有更优雅的写法:

with open('1.txt', 'r') as f:
    data = f.read()

另外python库中还有一个模块contextlib,使你不用构造含有__enter__, __exit__的类就可以使用with:

from contextlib import contextmanager
from __future__ import with_statement
@contextmanager
def context():
	print 'entering the zone'
    try:
		yield
	except Exception, e:
		print 'with an error %s'%e
		raise e
	else:
		print 'with no error'

with context():
	print '----in context call------'

entering the zone
----in context call------
with no error

猜你喜欢

转载自blog.csdn.net/Frank_LJiang/article/details/106281919