Python with语句
直接把参考的文章放上面吧 :这个更专业,可以直接看这个。
https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/
之前在有些教程中看到了如下的的代码:
with open("/tmp/foo.txt") as file:
data = file.read()
居然也可以这么写。具体是什么意思呢,with是怎么用的。
废话不多说,以下是我自己的理解:
首先with的作用:
使用with后不管with中的代码出现什么错误,都会进行对当前对象进行清理工作。
例如file的file.close()方法,无论with中出现任何错误,都会执行file.close()方法
其次with只有特定场合下才能使用。,这个特定场合只的是那些支持了上下文管理器的对象。
这些对象有:
复制代码
1 file
2 decimal.Context
3 thread.LockType
4 threading.Lock
5 threading.RLock
6 threading.Condition
7 threading.Semaphore
8 threading.BoundedSemaphore
复制代码
那么什么是上下文管理器:
这个管理器就是在对象内实现了两个方法:enter() 和exit()
enter()方法会在with的代码块执行之前执行,exit()会在代码块执行结束后执行。
exit()方法内会自带当前对象的清理方法。
with语句类似
try :
except:
finally:
的功能:但是with语句更简洁。而且更安全。代码量更少。
with 用法:
格式:
with context_expression [as target(s)]:
with-body
例子:
with open(r'somefileName') as somefile:
for line in somefile:
print line
# ...more code
with后面为一个表达式,表达式返回的是一个上下文管理器对象,我的理解就是表达式的返回结果。使用as 可以将这个结果赋值给某个变量。方便之后操作。
一个感觉更牛掰的例子:
nested 函数:
with nested(A(), B(), C()) as (X, Y, Z):
# with-body code here
等同于:
with A() as X:
with B() as Y:
with C() as Z:
# with-body code here
直接with后面的表达式就是个方法。并且把连着三个函数的方法直接赋值给不同变量。
上下文管理器可以自定义。也可以重写enter()和exit()方法。
如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的其他事物相联系。通过联系,你可将想法内化于心,从各种角度看问题,直至找到适合自己的方法。这才是思考的真谛!
──马文·明斯基