gpt4 book ai didi

python - Matlab 中的上下文管理器 : Invoking __enter__ in Matlab

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:21 26 4
gpt4 key购买 nike

我有一个 python 包,我想在 Matlab 中使用它的类和方法。我知道这可以从 Matlab 2014b 开始直接完成。我的意思是您所要做的就是在语句的开头添加 py. 。然而,到目前为止一切顺利,我无法弄清楚如何通过 MATLAB 处理 context managers,它们是使用 with 语句调用的。例如,假设我们在名为 app.py 的模块中有以下类,

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 中,我可以将其称为

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

ans =

logical

0

并且我在我的工作区中看到了一个 App 实例。然而,正如预期的那样,只有 __init__ 被调用,而不是 __enter__

那么,有没有一种方法可以从 Matlab 调用 __enter__,就好像我们在 Python 中调用 with App(input) as app: 一样?

注意:我使用的是 Python 3.5.1 和 Matlab 2017b

最佳答案

我认为没有任何方法可以从 MATLAB 调用 Python 类的 __enter__ 方法,但是 __exit__ 方法可能被隐式调用(我将在下面进一步解决这个问题)。

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

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

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

s = fread(fid);
...
end

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

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

由于 MATLAB 具有与 Python 不同的“上下文管理”方式,这可以解释为什么无法访问 __enter__ 方法。我尝试了一个我知道有的类(class):io.FileIO类(class)。我首先寻求帮助:

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

关于python - Matlab 中的上下文管理器 : Invoking __enter__ in Matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47192413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com