了解Swig生成的Python文件

时间:2019-04-15 09:34:51

标签: python swig

在我目前参与的一些工作过程中,我需要更好地了解使用Swig包装C ++时生成的.py文件的内容。这是在现有系统(我未编写)的上下文中,该系统添加了一些自定义Python,用于处理模块中globals()的内容。在尝试理解这一点时,我意识到我什至都不了解Swig生成的“正常”代码。

例如,假设我们要创建一个模块MyModule,并在其中包装一个C ++函数void f()。以下内容将出现在Swig生成的Python文件MyModule.py中:

def f():
    return _MyModule.f()
f = _MyModule.f

我的问题是:上面的前两行的意义是什么?前两行添加到MyModule的globals()中的'f'条目立即被第三行覆盖,我认为这基本上等同于前面的def f()

我想念什么吗?

1 个答案:

答案 0 :(得分:0)

您的分析是正确的-您显示的第三行的作业完全隐藏了前两个。

在简单的情况下是正确的,但是有时却没有发生。以这个SWIG文件为例:

%module test

%pythonprepend %{
#hello world
%}

void foo();

此处foo()的python定义不会像您的示例那样被隐藏,因为所生成的函数中包含额外的python代码。 (即使只是评论)。

我认为总是发出定义而不是仅在需要时才发出的原因可能是历史原因,尽管我无法通过快速查找找到确切的示例。 SWIG支持以多种不同方式为许多不同版本的Python生成Python代码。 (例如,查看-builtin生成的代码或-python -help的输出以了解变化的幅度。因此,这些分配可能曾经在运行时测试中被删除,而在过时和/或是遥远的过去的宿醉。

即使在现代情况下,尽管在.py文件中可见方法的定义仍然有一个实质性的好处,那就是IDE可以执行诸如计数参数,读取其名称和文档字符串等操作。仍然。