因此,我在Python中遇到了自定义类型、函数和属性的问题。
当我使用Python时,我想在我的一个自定义类型(例如Vector4)上设置一个属性,我的代码将为const char* attribute_name
参数获得一个NULL (是的,我正在导入我的模块)。
奇怪的是,当我在setter函数中硬编码属性名时,我得到了错误:
SystemError: error return without exception set
我确实看到对象是用Python创建的(也是用C++创建的),所以我认为这不是问题所在。如果setattro钩子成功地在C++中设置了属性,则返回1,并且看到调用代码并在C++侧设置属性。在设置属性时不会引发错误/异常。
此外,当我用Python调用类实例上的函数时,它会调用tp_getattro
中的函数集,而不是检查字典。
我不完全确定为什么,可能是因为我正在设置一个字典,并将我的函数放在其中,而不是通过PyModuleDef
数组执行,因此在调用PyType_Ready
时没有看到函数。
有人知道为什么会发生这种事吗?我们正在使用Python3.2。
相关:
我有一个基类型(tp_new
和tp_dealloc
),然后在运行时创建派生类型。派生类型有字典、tp_base
、tp_getattro
和tp_setattro
。
函数是如何绑定到Python类/类型的:
PyMethodDef newMethod;
newMethod.ml_doc = newMethod.ml_name = funcName;
newMethod.ml_flags = METH_VARARGS;
newMethod.ml_meth = pythonFunc;
PyGeneralObj* selfFake = PyObject_New(PyGeneralObj, &MetaEngineType);
selfFake->className = className;
selfFake->funcName = funcName;
Py_INCREF((PyObject*)selfFake);
PyObject *func = PyCFunction_New(&newMethod, (PyObject*)selfFake);
PyObject *method = PyInstanceMethod_New(func);
ErrorIf((method == NULL), "Python: Cannot create instance function. %s",
funcName);
ErrorIf((PyDict_SetItem(classObj->m_pyClassType->tp_dict,
PyReturnStr(newMethod.ml_name), method) == -1),
"Python: Cannot create function in dictionary.");
Py_DECREF(func);
Py_DECREF(method);
其中funcName和className为const *。pythonFunc是一个通用的python函数,它处理对绑定到元系统的所有函数的调用。classObj是指向具有成员m_pyClassType (PyTypeObject类型)的PythonClass的指针。
PyGeneralObj
是一个新对象,有两个const *和一个void* (这是C++中的对象)
我做PyType_Ready
,没有错误,然后增加我的类型。然后,我将对象添加到模块PyObject中,这是从PyImport_ImportModule
提供的。我确实将我的主模块附加到运行时,并将python初始化并导入我的模块。
如果需要更多的信息/代码,我可以张贴更多。我希望这是有意义的,这是我第一次在堆栈溢出上发帖。
为了澄清这一点,我们想要在C++端完全解析动态属性。对于函数,我希望能够覆盖PyObject* self
参数,以便获得需要调用的函数的字符串名称。
我们不想使用第三方库/接口,比如Boost、Cython等等。
发布于 2011-10-18 16:31:35
问题是在我实现getattro时。
https://stackoverflow.com/questions/7759827
复制相似问题