with语句在Python中使用
程序员文章站
2024-02-20 11:16:28
...
引言:
with语句生于Python2.5,通过 from __future__ import with_statement 导入后使用;2.6以后无需导入直接使用;
最常用的两个地方,文件使用后自动关闭、线程中锁的自动获取和释放;
可以取代try/finally操作,优化代码量;
有可能遇到的错误:
1、try finall操作文件没有关闭文件会报的错:
SyntaxError: unexpected EOF while parsing
语法:
with语句代码块
context_expression 要返回一个上下文管理器对象,即with 上下文管理器对象 ;
如果指定了 as 子句的话,会将上下文管理器的 __enter__() 方法的返回值赋值给 target(s)。target(s) 可以是单个变量,或者 由“()”括起来的元组
(不能是仅仅由“,”分隔的变量列表,必须加“()”)
总结:
with常用于文件的自动关闭以及线程锁的自动释放,更多相关原理,自定义上下文管理器,contextlib 模块,装饰器 contextmanager等参考大神帖子,参见’相关‘;
相关:
https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/
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/