with语句在Python中使用

引言:
    with语句生于Python2.5,通过 from __future__ import with_statement 导入后使用;2.6以后无需导入直接使用;
    

    with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源;


用途:
    最常用的两个地方,文件使用后自动关闭、线程中锁的自动获取和释放;
    
    可以取代try/finally操作,优化代码量;

用例:

    1、Python with用于文件使用后自动关闭:

with open(r'E:\majingwei\myProjects\myPython\current\txtFile.txt', 'rb') as file:
    for line in file:
        print(line)
#try/finally实现
file1 = open(r'E:\majingwei\myProjects\myPython\current\txtFile2.txt', 'rb')
try :
    for line in file1:
        print(line)
finally:
    file1.close()

    2、Python with用于线程锁的自动获取和释放:

'''
线程锁:强制使某段代码单线程运行,用于防止多个线程修改同一个数据导致混乱;

说明:不上锁下面例子的num并不确定,上锁后num打印只能是0;
'''
import threading
#创建锁对象
lock = threading.Lock()
#多个线程共享的数据
num = 0
def run(n):
    global num
    for i in range(10000000):
        lock.acquire()
        try:
            num = num + n 
            num = num - n    
        finally:
            #修改完一定要释放锁
            lock.release()
        '''
        #与上面代码功能相同,with lock可以自动上锁与解锁
        with lock:
            num = num + n
            num = num - n

if __name__ == "__main__":
    t1 = threading.Thread(target=run, args=(2,))
    t2 = threading.Thread(target=run, args=(3,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print("num =",num)
报错:
    有可能遇到的错误:
    1、try finall操作文件没有关闭文件会报的错:
        SyntaxError: unexpected EOF while parsing
语法:
    
with context_expression [as target(s)]:
        with-body     
    with 上下文管理器对象 【as 上下文管理器的__enter__()方法的返回值】:
         with语句代码块
        
          context_expression 要返回一个上下文管理器对象,即with 上下文管理器对象 ;
    如果指定了 as 子句的话,会将上下文管理器的 __enter__() 方法的返回值赋值给 target(s)。target(s) 可以是单个变量,或者      由“()”括起来的元组
    (不能是仅仅由“,”分隔的变量列表,必须加“()”)

总结:
    with常用于文件的自动关闭以及线程锁的自动释放,更多相关原理,自定义上下文管理器,contextlib 模块,装饰器 contextmanager等参考大神帖子,参见’相关‘;

相关:
    https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值