私はMATLABからPythonクラスの__enter__
メソッドを呼び出すためにどのような方法があると信じていませんが、__exit__
方法は暗黙的であるかもしれません呼び出されます(私はこれをさらに以下に説明します)。
これは、最初にその範囲は、通常、または経由して終了するかどうかにかかわらず、割り当てとスコープが制限された形でリソースを解放する方法を提供することです(__enter__
と__exit__
方法による)context managersの目的を、考慮することが重要ですエラー。 MATLABはより限定されたスコープの手段を持っています。各関数はそれ自身のworkspaceを持ち、その関数内のループ、条件文などの制御構造はすべてその作業領域を共有します(これらの制御構造は、スコープ)。
MATLABでワークスペースを終了すると、そのワークスペースに含まれる変数はクリアされますが、割り当てられたリソースは引き続き解放する必要があります。これはonCleanup
オブジェクトで実現できます。それらがメモリからクリアされると、既存のリソースを管理するための所定の機能が呼び出されます。 exampleが開くと、ファイルから読み込むことになります。
ここ
function openFileSafely(fileName)
fid = fopen(fileName, 'r');
c = onCleanup(@() fclose(fid));
s = fread(fid);
...
end
、ファイルが開かれ、その後から読み込まれます。 オブジェクトc
が作成され、c
が機能を終了するとメモリから消去されたときにファイルを閉じる。ファンクションの最後にファイルがfclose(fid)
で単純にクローズされた場合、ファンクションが終了すると(データの読込み中など)エラーが発生すると、ファイルはまだ開いたままになります。 onCleanup
オブジェクトを使用すると、関数の終了方法に関係なくファイルが確実に閉じられます。ここでは、これはPythonで処理することができる方法の例です:
with open('some_file', 'w') as opened_file:
opened_file.write('Hola!')
MATLABは、Pythonよりも、「コンテキスト管理」のさまざまな手段を有しているので、それは__enter__
メソッドにアクセスすることはできませんなぜ、これが説明できます。私が知っていたクラス、つまりio.FileIO
クラスを試しました。最初にヘルプを探しました:
>> py.help('io.FileIO.__enter__')
Help on method_descriptor in io.FileIO:
io.FileIO.__enter__ = __enter__(...)
ヘルプテキストが見つかりました。特にが役に立ちます。がありますが、それはあります。しかし、私は、オブジェクトを作成し、そのmethods list、__enter__
も__exit__
(も明らかと同等)のいずれを見たときがあります:
>> fio = py.io.FileIO('test.txt');
>> methods(fio)
Methods for class py._io.FileIO:
FileIO eq ge le read readinto seek truncate writelines
char fileno gt lt readable readline seekable writable
close flush isatty ne readall readlines tell write
Methods of py._io.FileIO inherited from handle.
Methods for class handle:
addlistener eq findprop gt le ne
delete findobj ge isvalid lt notify
私も、fio
オブジェクトをクリアしたときに、私は何か面白いものを気づきませんでした。 fio
オブジェクトは(ファイルを開いた状態で)まだ存在していましたが、削除したり、ファイルを移動することができませんでした。しかし、clear fio
、というコマンドを発行した後、最初にファイルを閉じることなく、ファイルと正常にやりとりすることができました。これは、ファイルが自動的に閉じられたことを意味します。これは、私が暗黙のうちに__exit__
メソッドが呼び出されるかもしれないのだろうかと疑問に思っています。