RAII 概念与在 Python 中的应用
RAII(Resource Acquisition Is Initialization),即资源获取即初始化,是一种设计模式,用于解决资源的获取与初始化的问题,最早在 C++中提出与推广。
在这篇文章我来简单地介绍一下 RAII 的概念,以及在 Python 中的应用。
RAII 的概念
在计算机与程序的世界中,有一些资源,比如文件、网络连接、数据库连接、线程、进程等,这些资源在使用的时候需要获取,在使用完成后需要释放。如果不及时释放,会导致资源泄露,造成资源的浪费,程序出错甚至系统崩溃。
一个简单的示例就是文件的读写。
1 2 3 4
| f = open('test.json', 'r') raw = f.read() data = json.loads(raw) f.close()
|
这段代码看起来没有什么问题,但是当test.json
文件的内容不是合法的 JSON 格式时,第四行代码反序列化数据就会抛出异常,导致第五行代码无法执行,文件没有被关闭。
这个例子告诉我们在处理一些资源时,需要注意在操作过程中是否会发生一些意外情况,例如抛出异常,并且在意外情况发生后,也需要关闭资源。
在 Python2.5 之前的版本中,我们用try-finally
来保证程序最终会关闭资源。
1 2 3 4 5 6 7 8
| try: f = open('test.json', 'r') raw = f.read() data = json.loads(raw) except JSONDecodeError: ... finally: f.close()
|
在简单的文件读取操作中,使用try
语句多少有点大材小用。为了更好地处理类似的资源管理问题,Python2.5 引入了with
语句,做到无论语句块中的代码执行是否抛出异常,都可以在退出with
语句块时执行清零代码。
事实上在 Python 中进行文件读写的标准方式就是使用with open
语句。
1 2 3
| with open('test.json', 'r') as f: raw = f.read() data = json.loads(raw)
|