本文基于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类,可以创建该类的一个对象(构造函数传入一个函数),然后在这个对象的析构函数中调用这个函数,使用的时候,在函数体重创建这个对象并传入函数就可以了,由于函数作用域结束,会自动删除栈内变量,导致变量被析构,从而调用构造时传入的那个函数,那个函数的功能就是释放一个

本文探讨了Python3中的对象回收机制,特别是如何模仿Golang的defer语义。通过分析Python的垃圾回收逻辑,包括引用计数和标记-清除策略,作者解释了在Python中实现类似defer功能的Defer类的可行性和限制,并给出了具体实现代码。尽管这种方法在某些场景下有效,但需要注意特殊情况如循环引用和不可变对象的优化,以及在异常处理和调试模式下的行为。

624

被折叠的 条评论
为什么被折叠?



