2017-11-09 8 views
2

私はPythonパッケージを持っています。私はそのクラスとメソッドをMatlabで使いたいと思います。これはMatlab 2014b以降で直接行うことができます。私はあなたの声明の冒頭にpy.を追加するだけです。しかし、これまでのところ、withステートメントを使用して呼び出されるコンテキストマネージャー(MATLAB経由)の処理方法を理解できませんでした。たとえば、私たちは、app.pyと呼ばれるモジュールにMATLABでMatlabのコンテキストマネージャ:Matlabで__enter__を呼び出す

class App(object): 

    def __init__(self, input): 
     self._input = input 
     self._is_open = False 

    def __enter__(self): 
     self._is_open = True 
     # many other stuff going after this but not relevant to this problem 

を以下のクラスを持っていると仮定し、私は

app = py.app.App(input); 
py.getattr(app, '_is_open') 

ans = 

logical 

0 

としてこれを呼び出すことができますし、私は私のワークスペースにアプリケーションのインスタンスを参照してください。しかし、期待通りに__init__が呼び出されますが、__enter__は呼び出されません。

Matlabの__enter__をPythonでwith App(input) as app:のように呼び出す方法がありますか?

注:私は、Python 3.5.1を使用していますMatlabの2017b

答えて

1

私は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__メソッドが呼び出されるかもしれないのだろうかと疑問に思っています。

関連する問題