本文基于python3及官方解释器cpython的实现。
引子:
比如说golang,
func dealFile(fn string) {
fd = open(fn)
defer fd.close() //defer保证fd.close在函数结束后被调用
....//在这里做其他事情
}
golang通过defer关键字来实现一种保证资源释放的办法,非常好用。
若以python来实现相关的需求,有两种办法,with和try...finally比如:
with open(fn) as fd:
....
或者
fd = open(fn)
try:
...
finally:
fd.close() #这里保证fd句柄得到关闭
这样一方面导致结构上难看(增加了缩进,如果有多个资源需要关闭,可能导致多层缩进),另外还要求对象要支持with的话必须实现额外的__enter__和__exit__方法。另外一方面with和finally的语法结构打乱了程序的业务逻辑,使得代码变得丑陋。我感觉比defer难用太多,对比来看,golang的defer是极好的设计。那么,有没有办法参考golang来自定义实现一个简洁优雅的实现呢?
我回想到,c++的RAII思想,实现一个Defer类,可以创建该类的一个对象(构造函数传入一个函数),然后在这个对象的析构函数中调用这个函数,使用的时候,在函