PythonでRAIIを見つけようとしています。Resource Allocation Is Initialization は、オブジェクトが作成時に初期化される 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?
...
使用後に名前を手動で削除することもできますが、それは非常に見苦しく、私の努力が必要です。
そして、この場合、Do-What-I-Mean を実行したいと思います。
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ですか?
私はそれを理解していませんか?
おそらく、言語の動的な側面の利点を取り除こうとしているのでしょう。スコープを強制したい場合があるのは利己的ですか?
怠慢な変数の再利用の間違いをコンパイラ/インタプリタに見つけてもらいたいと思うのは怠惰ですか? そうですね、もちろん怠け者ですが、悪い意味で怠け者なのでしょうか。