我有一个python包,我想在Matlab中使用它的类和方法。我知道这可以直接从matlab2014b开始实现,我的意思是你所要做的就是在语句的开头添加py.
。不过,到目前为止,我还不知道如何通过MATLAB来处理上下文管理器,它是使用with
语句调用的。例如,假设我们在一个名为应用程序副本你说
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
在Matlab中,我可以称之为
^{pr2}$我在我的工作区看到了一个App实例。但是,正如预期的那样,只有__init__
被这样调用,而不是{
那么,有没有一种方法可以从Matlab调用__enter__
,就像我们在Python中调用with App(input) as app:
?在
注意:我使用的是python3.5.1和matlab2017b
我不相信有任何方法可以从MATLAB调用Python类的
__enter__
方法,但是__exit__
方法可能被隐式调用(我将在下面进一步讨论这个问题)。在首先要考虑context managers(通过
__enter__
和__exit__
方法)的目的,即提供一种以范围限制的方式分配和释放资源的方法,无论该作用域是否正常退出或通过错误退出。MATLAB有一种更为有限的“作用域”方法:每个函数都有自己的workspace,该函数中的控制结构(如循环、条件语句等)都共享该工作区(与许多语言不同,这些控制结构都有自己的子作用域)。在当在MATLAB中退出一个工作区时,它包含的变量将被清除,但是分配的任何资源可能仍然需要释放。这可以通过^{} 对象来实现。当它们从内存中清除时,它们调用一个给定的函数来管理现有资源。一个example将打开并读取文件:
在这里,打开一个文件并随后从中读取。将创建一个}时关闭文件。如果文件只是在函数末尾用
^{pr2}$onCleanup
对象c
,该对象将在退出函数时从内存中清除{fclose(fid)
关闭,那么函数的错误退出(例如在读取数据的过程中)将导致文件仍保持打开状态。使用onCleanup
对象可确保无论函数如何退出,文件都将被关闭。下面是一个在Python中如何处理的示例:由于MATLAB的“上下文管理”方法与Python不同,这可以解释为什么不能访问} 类。我首先寻求帮助:
__enter__
方法。我尝试了一个我知道有一个类:^{它会找到一些帮助文本。它不是特别有用,但它就在那里。但是,当我创建一个对象并查看它的methods list时,}(也没有明确的等价物):
__enter__
和{不过,当我清除
fio
对象时,我确实注意到了一些有趣的东西。当fio
对象仍然存在(文件打开时),我无法如预期的那样删除或移动文件。但是,在发出命令clear fio
,之后,我没有首先关闭文件,我就可以正常地与文件交互了。这意味着文件已自动关闭。这使我想知道__exit__
方法是否被隐式调用,但我还没有确定它是否正确。在相关问题 更多 >
编程相关推荐