|
2 | 2 |
|
3 | 3 | #上下文管理器 |
4 | 4 |
|
5 | | -在[《文件(1)》](./126.md)中提到,如果要打开文件,一种比较好的方法使使用`with`语句,因为这种方法,不仅结构简单,更重要的是不用再单独去判断某种异常情况,也不用专门去执行文件关闭的指令了。 |
| 5 | +在[《文件(1)》](./126.md)中提到,如果要打开文件,一种比较好的方法是使用`with`语句,因为这种方法,不仅结构简单,更重要的是不用再单独去判断某种异常情况,也不用专门去执行文件关闭的指令了。 |
6 | 6 |
|
7 | 7 | 本节对这个有点神奇的`with`进行深入剖析。 |
8 | 8 |
|
|
14 | 14 |
|
15 | 15 | 如果把它作为一个概念来阐述,似乎有点多余,因为从字面上也可以有一丝的体会,但是,我要说的是,那点直觉的体会不一定等于理性的严格定义,特别是周遭事物越来越复杂的时候。 |
16 | 16 |
|
17 | | -“上下文”的英文是context,在网上检索了一下关于“上下文”的说法,发现没有什么严格的定义,另外,不同的语言环境,对“上下文管理”有不同的说法。根据我个人的经验和能看到的某些资料,我以为可以把“上下文”理解为某一些语句构成的一个环境(也可以说使代码块),所谓“管理”就是要在这个环境中做一些事情,做什么事情呢?就Python而言,是要将前面某个语句(“上文”)干的事情独立成为对象,然后在后面(“下文”)中使用这个对象来做事情。 |
| 17 | +“上下文”的英文是context,在网上检索了一下关于“上下文”的说法,发现没有什么严格的定义,另外,不同的语言环境,对“上下文管理”有不同的说法。根据我个人的经验和能看到的某些资料,我以为可以把“上下文”理解为某一些语句构成的一个环境(也可以说是代码块),所谓“管理”就是要在这个环境中做一些事情,做什么事情呢?就Python而言,是要将前面某个语句(“上文”)干的事情独立成为对象,然后在后面(“下文”)中使用这个对象来做事情。 |
18 | 18 |
|
19 | 19 | **上下文管理协议** |
20 | 20 |
|
21 | | -英文是Context Management Protocol,既然使协议,就应该是包含某些方法的东西,大家都按照这个去做(协商好了的东西)。Python中的上下文管理协议中必须包含`__enter__()`和`__exit__()`两个方法。 |
| 21 | +英文是Context Management Protocol,既然是协议,就应该是包含某些方法的东西,大家都按照这个去做(协商好了的东西)。Python中的上下文管理协议中必须包含`__enter__()`和`__exit__()`两个方法。 |
22 | 22 |
|
23 | 23 | 看这个两个方法的名字,估计读者也能领悟一二了(名字不是随便取的,这个某个岛国取名字的方法不同,当然,现在人家也不是随便取了)。 |
24 | 24 |
|
25 | 25 | **上下文管理器** |
26 | 26 |
|
27 | | -网上能够找到的最通常的说法是:上下文管理器使支持上下文管理协议的对象,这种对象实现了`__enter__()`和`__exit__()`方法。 |
| 27 | +网上能够找到的最通常的说法是:上下文管理器是支持上下文管理协议的对象,这种对象实现了`__enter__()`和`__exit__()`方法。 |
28 | 28 |
|
29 | | -这个简洁而准确的定义,一般情况下一些高手使理解了。如果读者有疑惑,就说明...,我还是要把一个高雅的定义通俗化更好一些。 |
| 29 | +这个简洁而准确的定义,一般情况下一些高手是理解了。如果读者有疑惑,就说明...,我还是要把一个高雅的定义通俗化更好一些。 |
30 | 30 |
|
31 | | -在Python中,下面的语句,也存在上下文,但它们使一气呵成执行的。 |
| 31 | +在Python中,下面的语句,也存在上下文,但它们是一气呵成执行的。 |
32 | 32 |
|
33 | 33 | >>> name = "laoqi" |
34 | 34 | >>> if name == "laoqi": |
|
58 | 58 |
|
59 | 59 | ##必要性 |
60 | 60 |
|
61 | | -刚才那个向文件中写入hello和python两个单词的示例,如果你觉得在工程中也可以这样做,就大错特错了。因为它存在隐含的问题,比如在写入了hello之后,不知道什么原因,后面的python不能写入了,最能说服你的是恰好遇到了“磁盘已满”——虽然这种情况的概率可能比抓奖券还还小,但作为严禁的程序员,使必须要考虑的,这也是程序复杂之原因,这时候后面的操作就出现了异常,无法执行,文件也不能close。解决这个问题的方法使用`try ... finally ...`语句,读者一定能写出来。 |
| 61 | +刚才那个向文件中写入hello和python两个单词的示例,如果你觉得在工程中也可以这样做,就大错特错了。因为它存在隐含的问题,比如在写入了hello之后,不知道什么原因,后面的python不能写入了,最能说服你的是恰好遇到了“磁盘已满”——虽然这种情况的概率可能比抓奖券还还小,但作为严禁的程序员,是必须要考虑的,这也是程序复杂之原因,这时候后面的操作就出现了异常,无法执行,文件也不能close。解决这个问题的方法是用`try ... finally ...`语句,读者一定能写出来。 |
62 | 62 |
|
63 | 63 | 不错,的确解决了。 |
64 | 64 |
|
@@ -329,4 +329,4 @@ contextlib.contextmanager是一个装饰器,它作用于生成器函数(也 |
329 | 329 |
|
330 | 330 | [总目录](./index.md) | [上节:生成器](./215.md) | [下节:错误和异常(1)](./216.md) |
331 | 331 |
|
332 | | -如果你认为有必要打赏我,请通过支付宝: **[email protected]**,不胜感激。 |
| 332 | +如果你认为有必要打赏我,请通过支付宝: **[email protected]**,不胜感激。 |
0 commit comments