PyTypeObject的静态工厂

时间:2012-08-23 19:17:21

标签: python c api

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

  1. 在包含指向PyTypeObject的指针的类中,当我尝试将该静态变量设置为等于工厂函数的结果(在另一个类中但是是静态的)时,我得到“未定义的引用”链接器错误。我认为这是有道理的,因为函数直到运行时才会发生,但我不知道另一种方法。
  2. 我不知道如何动态设置PyTypeObject字段,因为第一个字段始终是一个宏:PyObject_VAR_HEAD。
  3. 希望这是有道理的。基本上,我正在努力使它成为几个类不必静态重新定义PyTypeObject,而是可以从工厂函数实例化它们的PyTypeObject变量。

1 个答案:

答案 0 :(得分:0)

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

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

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