我一直在努力寻找RAII https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization在Python中。
资源分配即初始化是 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 有“与”语句 http://www.python.org/dev/peps/pep-0343/但这需要我明确输入__enter__
and __exit__
功能
通常似乎更倾向于清理文件等资源
和互斥锁,无论退出向量如何。它对范围界定没有帮助。
或者我错过了什么?
我搜索了“Python RAII”和“Python scope”,但找不到任何内容
直接且权威地解决了这个问题。
我已经查看了所有 PEP。这个概念似乎没有得到解决
在 Python 中。
因为我想在 Python 中定义作用域变量,所以我是一个坏人吗?
这是不是太不Pythonic了?
我这不是在摸索吗?
也许我正试图剥夺该语言动态方面的好处。
有时想要强制执行范围是自私吗?
我是否懒惰想要编译器/解释器
捕捉我疏忽的变量重用错误?嗯,是的,我当然很懒,
但我是不是太懒了?