会话管理
in python with 0 comment

会话管理

in python with 0 comment

先来谈谈历史

在Python2.5时,会话管理被引入了Python。再次之前这部分功能由第三方库实现,而PEP343中明确引入with的会话管理。
所以我们现在能够见到很多使用会话管理的代码,比如文件IO中:

with open(filename, mode, encoding) as file:
    pass

会话管理的方便

这种优雅的代码为我们提供了不少便利,比如在文件IO的过程中,一旦代码执行到了with的作用范围外,文件会自动关闭。这也免去了频繁的.close()的代码。

但这是怎么实现的

会话管理通过包装 with 语句来设置和清理代码行为。这种行为通过了两个魔法方法来定义:

__enter__

___enter__(self) 定义了使用 with 语句时如何创建会话管理的行为。返回值为 with 语句或 as 的绑定名称。

__exit__

__exit__(self, exception_type, exception_value, traceback)定义了代码执行后或终止后,会话管理的操作。可以用来最常见的清楚工作或异常处理。
一旦代码执行成功,exception_type,exception_value 和 traceback 都会为None。
执行失败可以选择处理异常或直接交给用户进行处理。如果需要会话管理进行异常处理,需要return True

来个栗子

class WithDemo(object):
    def __init__(self, obj):
        self.object = obj

    def __enter__(self):
        return self.object

    def __exit__(self, exception_type, exception_val, trace):
        try:
            self.object.close()
        except Exception as e:
            print(e)
            return True


with WithDemo(int(1)) as f:
    f += 1
print(f)

这时候,控制台的输出应该是:

'int' object has no attribute 'close'
2
Responses