了解 Swig 生成的 Python 文件

Understanding Swig generated Python file

在我目前参与的一些工作过程中,我需要更好地理解使用Swig包装C++时生成的.py文件的内容。这是在现有系统(我没有编写)的上下文中,它添加了一些自定义 Python 来操纵模块中 globals() 的内容。在试图理解这一点时,我意识到我什至不理解 'normal' Swig 生成的代码。

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

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

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

我是不是漏掉了什么?

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

在简单的情况下确实如此,但有时它不会发生。以这个 SWIG 文件为例:

%module test

%pythonprepend %{
#hello world
%}

void foo();

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

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

即使在现代情况下,尽管在 .py 文件中可见方法的定义仍然有一个实质性的好处,那就是 IDE 可以做一些事情,比如计算参数,读取它们的名字和文档字符串等。