【问题标题】:Understanding Swig generated Python file了解 Swig 生成的 Python 文件
【发布时间】:2019-04-17 14:38:51
【问题描述】:

在我目前参与的一些工作过程中,我需要更好地理解使用 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()

我错过了什么吗?

【问题讨论】:

    标签: python swig


    【解决方案1】:

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

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

    %module test
    
    %pythonprepend %{
    #hello world
    %}
    
    void foo();
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-25
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多