当前位置:   article > 正文

python with语句用法_python with用法

python with用法

一、with的应用场景:

python语言中,with语句适用于资源相关操作,锁相关操作,文件相关操作,异常处理等相关操作情景,可以代替try...except...finally...的模式,让程序员不用写一些可能会忘写的收尾的代码,使代码更简洁。

如下代码:在编码中可能会忘记关闭文件,或者在读取文件时发生异常,没有进行任何处理

  1. import os
  2. if not os.path.exists(u'F:/test'):
  3. os.makedirs('F:/test')
  4. f=open(u'F:/test/text.txt','r+')#打开文件,赋值给句柄
  5. print f.read()#操作句柄读取数据
  6. f.close()#关闭文件

 如下代码:对可能出现的异常进行处理,finally关闭文件

  1. import os
  2. if not os.path.exists(u'F:/test'):
  3. os.makedirs('F:/test')
  4. try:
  5. f=open(u'F:/test/text.txt','r+')#打开文件,赋值给句柄
  6. print f.read()#操作句柄读取数据
  7. except:
  8. print 'fail to open'
  9. exit(-1)
  10. finally:
  11. f.close()#关闭文件

为了代码简介,python用with来优雅的处理这段代码 

  1. import os
  2. if not os.path.exists(u'F:/test'):
  3. os.makedirs('F:/test')
  4. with open(u'F:/test/text.txt','r+') as f:#打开文件,赋值给句柄
  5. print f.read()#操作句柄读取数据

二、with语句原理

with expression [as target]:

        with-body

expression是任意表达式,获取上下文管理器,as target可选,with-body是with语句的语句体 

  1. 计算expression,并获取上下文管理器
  2. 保存上下文管理器的__exit()__方法
  3. 调用上下文管理器__enter()__方法
  4. 如果有as target,__enter()__方法的返回值赋给target
  5. 执行with语句体的内容,eg:上面打印出利用文件对象读取的文件内容
  6. 不管是否出现异常,调用第二步保存的上下文管理器的__exit()__方法,这里如果with语句体执行机过程中发生异常导致程序退出,那么异常的type、value、traceback等作为参数传递给__exit()__方法,否则,传递三个None

1、采用装饰器定义上下文管理器:

  1. #coding:utf-8
  2. from contextlib import contextmanager
  3. @contextmanager
  4. def demo():
  5. print '__enter()__'
  6. yield 'contextmangager demo'
  7. print '__exit()__'
  8. with demo() as demo:
  9. print 'with-body: '+demo
  1. __enter()__
  2. with-body: contextmangager demo
  3. __exit()__

 2、采用自定义支持closing的对象:

  1. #coding:utf-8
  2. class closing(object):
  3. def __init__(self,thing):
  4. self.thing=thing
  5. def __enter__(self):
  6. print '__enter()__'
  7. return self.thing
  8. def __exit__(self,*exc_info):
  9. print '__exit()__'
  10. self.thing.close()
  11. # 这里closing上下文管理器包装起来的对象必须具有close()方法的定义,否则会报错的
  12. class demo():
  13. def __init__(self):
  14. self.thing=open('C:\Users\***\Desktop\111.txt','w')
  15. def run(self):
  16. print "function running"
  17. def close(self):
  18. self.thing.close()
  19. with closing(demo()) as demo:
  20. demo.run()
  1. __enter()__
  2. function running
  3. __exit()__

 3、采用类定义上下文管理器(廖雪峰大神教程的webapp里面就有许多这样的例子)

  1. #coding:utf-8
  2. k=0
  3. m=0
  4. class Sample:
  5. def __init__(self):
  6. global k
  7. k+=1
  8. print k
  9. def __enter__(self):
  10. global k
  11. k+=1
  12. print k
  13. print "__enter__()"
  14. global m
  15. m+=1
  16. return m
  17. def __exit__(self, type, value, trace):
  18. print "__exit__()"
  19. with Sample() as sample:
  20. print sample
  1. 1
  2. 2
  3. __enter__()
  4. 1
  5. __exit__()

这里强调一点:看了许多博客,有的博客里面指出as target操作,是将expression赋值给target,这是不对的,从上面例子可以看出,是将__enter__()方法返回值赋值给target。

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号