我一直在尝试在 Python中找到RAII 。资源分配是初始化是 C++ 中的一种模式,对象在创建时就被初始化。如果失败,则抛出异常。这样,程序员就知道对象永远不会处于半构建状态。Python 可以做到这一点。
但 RAII 也适用于 C++ 的范围规则,以确保对象的迅速销毁。一旦变量从堆栈中弹出,它就会被销毁。这可能发生在 Python 中,但前提是没有外部或循环引用。
更重要的是,对象的名称仍然存在,直到它所在的函数退出(有时更长)。模块级别的变量将在模块的整个生命周期内一直存在。
如果我做这样的事情,我想得到一个错误:
for x in some_list:
...
... 100 lines later ...
for i in x:
# Oops! Forgot to define x first, but... where's my error?
...
我可以在使用后手动删除名称,但这会非常难看,并且需要我自己努力。
在这种情况下,我希望它做我的意思:
for x in some_list:
surface = x.getSurface()
new_points = []
for x,y,z in surface.points:
... # Do something with the points
new_points.append( (x,y,z) )
surface.points = new_points
x.setSurface(surface)
Python 做了一些作用域,但不是在缩进级别,只是在功能级别。要求我创建一个新函数只是为了限定变量以便我可以重用名称似乎很愚蠢。
Python 2.5 有“with”语句
,但这需要我明确地放入__enter__
和__exit__
函数,并且通常似乎更倾向于清理文件和互斥锁等资源,而不管退出向量如何。它对范围界定没有帮助。还是我错过了什么?
我搜索了“Python RAII”和“Python 范围”,但找不到任何直接且权威地解决该问题的内容。我查看了所有的 PEP。这个概念似乎没有在 Python 中得到解决。
我是一个坏人,因为我想在 Python 中使用范围变量吗?那是不是太不像 Pythonic 了?
我不是在摸索吗?
也许我正试图消除语言动态方面的好处。有时想要强制执行范围是自私的吗?
我是否因为希望编译器/解释器捕捉我疏忽的变量重用错误而懒惰?嗯,是的,我当然很懒,但我是不是很懒?