【问题标题】:Static factory for PyTypeObjectPyTypeObject 的静态工厂
【发布时间】:2012-08-23 19:17:20
【问题描述】:

我正在使用 Python C API 并尝试创建一个函数,该函数将分配 PyTypeObjects 的新实例以在多个 C++ 类中使用。这个想法是每个类都有一个指向 PyTypeObject 的指针,它将被这个工厂实例化。指针必须是静态的。 但是,我在使用这种方法时遇到了问题。

  1. 在包含指向 PyTypeObject 的指针的类中,当我尝试将静态变量设置为等于工厂函数的结果(在另一个类中但为静态的)时,出现“未定义的引用”链接器错误。我想这是有道理的,因为该函数要到运行时才会发生,但我不知道另一种方法。
  2. 我不知道如何动态设置 PyTypeObject 字段,因为第一个字段始终是一个宏:PyObject_VAR_HEAD。

希望这是有道理的。基本上,我试图让几个类不必静态地重新定义 PyTypeObject,而是可以从工厂函数中实例化它们的 PyTypeObject 变量。

【问题讨论】:

    标签: python c api


    【解决方案1】:

    试试这个:创建一个“模板”PyTypeObject,并使用结构复制(或 memcpy)来克隆基本模板。然后您可以在此之后填写必要的字段定义。这解决了 (2),因为您只需声明一次完整的 PyTypeObject。

    对于您的第一点,您只需在模块 init 中设置静态变量,而不是在静态变量声明中进行设置。因此,在您的模块实际初始化之前不会设置它。

    如果您打算经常这样做,那么可能值得一看 Boost::Python,它简化了从 C++ 类生成 CPython 包装器的过程。

    【讨论】:

    • 我不确定我是否确切地知道您的意思,但有几点: 1. 我听说对结构执行 memcpy 是危险的,尤其是具有函数指针的结构。大多数字段都设置为 0,但我不确定是否要依赖它。这让我觉得我应该逐个字段地复制,但是那个愚蠢的宏妨碍了。 2. 在模块init中设置静态PyTypeObject是什么意思?我不知道你的意思,但请注意,我正在嵌入 Python,所以我必须显式调用 init 例程。 Python 不会调用它,因为我没有将它作为导出函数提供。
    • memcpy 结构本身并没有什么问题,即使它们包含指针。问题是如果您在不更新或考虑所有副本的情况下释放对结构成员的引用。此外,memcpy/struct copy一个逐个字段的拷贝。没有区别。
    • 当您初始化 Python 解释器时,您将设置 PyTypeObject 静态变量。只需在您通常执行 PyType_Ready 的位置之前执行此操作即可。
    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多