matlab - 如何将目录转换为包?

标签 matlab package

我有一个目录,其中包含一些应该放入包中的辅助函数。第一步显然是将目录命名为 +mypackage\ 这样我就可以使用 mypackage.somefunction 调用函数。问题是,一些函数相互依赖,显然 MATLAB 需要包函数来调用同一个包中的函数,仍然通过显式声明包名称,所以我必须重写所有函数调用。更糟糕的是,如果我决定重命名包,所有函数调用也必须重写。当我 cd 进入名称以 + 开头的目录时,这些功能甚至不再正常工作。

有没有比大量重写更简单的解决方案? 或者至少像 import this.* 这样的自引用的东西以方便将来的包重命名?


编辑 我注意到类和静态方法也是如此,这就是为什么我将自引用部分放入 this separate question 中的原因.

最佳答案

事实上,我不知道你真的应该经常重命名你的包。在我看来,package in MATLAB 背后的整个想法是将一组相关的函数和类组织到一个集合中,您可以轻松地将其作为“工具箱”使用或分发,而不必担心名称冲突。

因此,将函数和类放入包中就像是制作精美的工具集合的最后步骤,因此您真的没有太多理由重命名您的包。此外,您只需在包名称前添加包函数调用一次。

...(停下来思考我要提出的建议是否是个好主意;))...

但是,如果您真的想避免必须遍历您的包并在您的函数调用前加上一个新的包名称,一种方法是使用函数 mfilename要获取当前运行的包函数的完整文件路径,解析路径字符串以找到父包目录(以“+”开头),然后将结果传递给 import函数导入父包。您甚至可以将这些步骤放在单独的函数 packagename 中(要求您还使用函数 evalin ):

function name = packagename

  % Get full path of calling function:
  callerPath = evalin('caller', 'mfilename(''fullpath'')');

  % Parse the path string to get package directories:
  name = regexp(callerPath, '\+(\w)+', 'tokens');

  % Format the output:
  name = strcat([name{:}], [repmat({'.'}, 1, numel(name)-1) {''}]);
  name = [name{:}];

end

然后您可以将它放在包函数的最开头,以自动让它们包含它们的父包命名空间:

import([packagename '.*']);

这是个好主意吗?好吧,我不确定如果您每次调用包函数时都这样做会对计算产生什么影响。此外,如果您有嵌套在包中的包,您将从 packagename 获得如下所示的输出:

'mainpack.subpack.subsubpack'

并且对import 的调用将只包括直接父包subsubpack。如果您还想包括其他父包,则必须按顺序从上述字符串中删除最后一个包并导入字符串的其余部分。

简而言之,这不是一个非常干净的解决方案,但是可以通过这种方式让您的包更容易重命名。但是,我仍然建议最好将包的创建视为创建核心工具集过程的最后一步,在这种情况下,重命名应该是不太可能的情况,并且在包函数调用前加上包名称会只需要做一次。

关于matlab - 如何将目录转换为包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5635413/

相关文章:

matlab - 非负矩阵分解 : The Alternating Least Squares Method

javascript - 使用 JavaScript 创建 .mat 文件

matlab - 检索特定排列而不在 Matlab 中存储所有可能的排列

R CMD 检查 : Unusual Checking installed package size note

Matlab:将ID与数据集(例如结构)相关联?

matlab - 如何在不耗尽内存的情况下在 Matlab 中使用 randsample?

git - 使用 Julia 安装模块

python - 如何将静态文件包含到 setuptools - python 包

python - Pip 安装挂起

php - 如何在 Sublime Text 2 中自动检查代码(PHP、Python、HTML、Javascript)中的错误?