2017-11-09 3 views
2

저는 파이썬 패키지를 가지고 있으며 Matlab의 클래스와 메소드를 사용하고 싶습니다. Matlab 2014b 이후 직접적으로이 작업을 수행 할 수 있음을 알고 있습니다. 제 말은 진술을 시작할 때 py.을 붙이면됩니다. 그러나 지금까지는 with 문을 사용하여 컨텍스트 관리자 인 (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 

으로 이것을 호출 할 수 있습니다, 우리는 app.py라는 모듈에 다음 클래스가 있다고 가정하고 내 작업 영역에서 응용 프로그램의 인스턴스를 참조 . 그러나 예상대로이 경우에만 __init__이 호출되지만 __enter__은 호출되지 않습니다.

Matlab에서 __enter__을 호출하는 방법은 파이썬에서 with App(input) as app:과 같이 호출하는 것입니까?

참고 : 파이썬 3.5.1를 사용하고 matlab에 2017b

답변

1

내가 MATLAB에서 파이썬 클래스의 __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 개체를 사용하면 함수가 종료되는 방식에 관계없이 파일이 닫힙니다. MATLAB 파이썬보다는 "컨텍스트 관리"의 다른 수단을 가지고 있기 때문에 그것은 __enter__ 방법에 액세스 할 수없는 이유,이 설명 할 수

with open('some_file', 'w') as opened_file: 
    opened_file.write('Hola!') 

: 다음은이 파이썬에서 처리 할 수있는 방법의 예입니다. 나는 내가 가지고 있었던 클래스와 시험했다 : 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__ 메서드가 암시 적으로 호출 될지 궁금하지만, 아직 확실하게 결정하지 못했습니다.