Matlab中的上下文管理器:在Matlab中调用

2024-07-03 06:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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


Tags: 方法pyselfappinputinitisdef
1条回答
网友
1楼 · 发布于 2024-07-03 06:27:13

我不相信有任何方法可以从MATLAB调用Python类的__enter__方法,但是__exit__方法可能被隐式调用(我将在下面进一步讨论这个问题)。在

首先要考虑context managers(通过__enter____exit__方法)的目的,即提供一种以范围限制的方式分配和释放资源的方法,无论该作用域是否正常退出或通过错误退出。MATLAB有一种更为有限的“作用域”方法:每个函数都有自己的workspace,该函数中的控制结构(如循环、条件语句等)都共享该工作区(与许多语言不同,这些控制结构都有自己的子作用域)。在

当在MATLAB中退出一个工作区时,它包含的变量将被清除,但是分配的任何资源可能仍然需要释放。这可以通过^{}对象来实现。当它们从内存中清除时,它们调用一个给定的函数来管理现有资源。一个example将打开并读取文件:

function openFileSafely(fileName)
  fid = fopen(fileName, 'r');
  c = onCleanup(@() fclose(fid));

  s = fread(fid);
  ...
end

在这里,打开一个文件并随后从中读取。将创建一个onCleanup对象c,该对象将在退出函数时从内存中清除{}时关闭文件。如果文件只是在函数末尾用fclose(fid)关闭,那么函数的错误退出(例如在读取数据的过程中)将导致文件仍保持打开状态。使用onCleanup对象可确保无论函数如何退出,文件都将被关闭。下面是一个在Python中如何处理的示例:

^{pr2}$

由于MATLAB的“上下文管理”方法与Python不同,这可以解释为什么不能访问__enter__方法。我尝试了一个我知道有一个类:^{}类。我首先寻求帮助:

>> py.help('io.FileIO.__enter__')
Help on method_descriptor in io.FileIO:

io.FileIO.__enter__ = __enter__(...)

它会找到一些帮助文本。它不是特别有用,但它就在那里。但是,当我创建一个对象并查看它的methods list时,__enter__和{}(也没有明确的等价物):

>> 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__方法是否被隐式调用,但我还没有确定它是否正确。在

相关问题 更多 >