欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

with语句在Python中使用

程序员文章站 2024-02-20 11:16:28
...
引言:
    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/