Eri*_*rik 7 import matlab packages package
我在MATLAB R2014b上,有一个问题,我将通过以下示例说明.
MWE可以如下制作或在此处下载为.zip文件.
+test
在路径上创建一个包文件夹,其中包含四个函数文件:
+test
a.m
b.m
c.m
d.m
Run Code Online (Sandbox Code Playgroud)
内容a.m
:
function a
disp 'Hello World!'
Run Code Online (Sandbox Code Playgroud)
内容b.m
:
function b
a
Run Code Online (Sandbox Code Playgroud)
如果从命令行运行b
,则必须先导入test
包(import test.*
)或运行test.b
.
运行b
将导致错误,因为函数的范围b
不包含函数a
.我们必须先导入它才能使用它.为此,我创造了c.m
:
function c
import test.*
a
Run Code Online (Sandbox Code Playgroud)
现在运行c
正常.
现在我的问题.如果我c.m
改为(保存在d.m
):
function d
a
import test.*
Run Code Online (Sandbox Code Playgroud)
即在调用package函数之后发出import命令a
.运行d
仍然可以正常工作,就好像导入命令的位置d.m
无关紧要.导入似乎在调用函数之前发生a
,这在d.m
导入之前的行上发生.
为什么会这样呢?这是预期的行为,它的用途是什么?MATLAB如何以及以何种顺序读取.m
文件并对其进行处理?更偏离主题,但总的来说:与MATLAB相比,如何导入以不同语言处理的包,命令的顺序是否重要?
我基于注释的先发制人的结论:最好只在MATLAB代码开头或附近使用导入函数.这清楚地显示了导入的内容在整个元素中可用(例如,功能).它还可以防止错误的假设,即在导入之前,内容尚未可用或引用具有相同名称的其他内容.
MATLAB 在评估函数之前执行静态代码分析,以确定该函数使用的变量/函数。语句的评估import
是静态代码分析的一部分。这是设计使然,因为如果您import
打包然后使用它的函数,MATLAB 需要在静态代码分析期间知道这一点。因此,无论您将语句放在函数中的什么位置import
,它都将具有与将其放在函数开头相同的效果。
您可以通过查看输出来轻松测试这一点,输出import
将列出所有当前导入的包。
+test/a.m
function a(x)
disp(import)
import test.*
end
test.a()
% test.*
Run Code Online (Sandbox Code Playgroud)
这就是为什么文档指出不要将语句放在import
条件中的原因。
不要
import
在函数内的条件语句中使用。MATLABimport
在计算条件语句中的变量之前对语句进行预处理。
function a(x)
disp(import)
if x
import test.*
else
import othertest.*
end
end
test.a()
% test.*
% othertest.*
Run Code Online (Sandbox Code Playgroud)
避免这种行为的唯一方法是允许静态代码分析器确定(毫无疑问)语句import
不会被执行。我们可以通过让条件语句只是一个逻辑值来做到这一点。
function a()
disp(import)
if true
import test.*
else
import othertest.*
end
end
test.a()
% test.*
Run Code Online (Sandbox Code Playgroud)
就与其他语言相比的导入而言,这实际上取决于语言。例如,在 Python 中,您必须在访问模块内容import
之前放置 。根据我的经验,这是典型的情况,但我确信还有很多例外。每种语言都会有所不同。