我正在开发一个接口,以便Python程序可以调用现有的C++库。如果我理解正确,这样的接口(和C++库)应该作为模块导入,比如^ {CD1}}。接口中的类型被定义为接口的C++侧的静态变量,并使用以下顺序注册为Python:
void PythonRegistrationData::RegisterType(PyObject* module, PyTypeObject* type)
{
if (type->ob_refcnt < 2)
{
if (type->tp_base != NULL)
RegisterType(module, type->tp_base);
Py_INCREF(type);
if (PyType_Ready(type) != 0)
throw GPython::DummyError();
PyModule_AddObject(module, type->tp_name, as<PyObject>(type));
}
}
确保基类在类之前被注册。根据C-API docs,“对于静态分配的类型对象,tpu name字段应该包含一个点。”因此,我用"abc.MyType"
初始化{'module' object has no attribute 'MyType'
(例如x = abc.MyType()
,之前做过import abc
)。如果我只使用"MyType"
,它似乎可以工作,但这似乎与官方文档和教程中的示例相矛盾。在
那么tp_name
字段的确切含义是什么,它到底应该包含什么呢?我不把模块名称放进去会有什么影响?在
通过做
使用“”将类型添加到模块(即设置属性)abc.MyType“作为属性名称。这意味着您需要使用
getattr(abc, 'abc.MyType')
来访问它,如果您想在abc
模块上访问它(您不能直接访问名称中带有点的属性)。您应该将tp_name
设置为“限定”名称(前面有abc.
),而不应该使用tp}名称作为属性名。在相关问题 更多 >
编程相关推荐