所以我在Python中的自定义类型、函数和属性遇到了一个问题。在
当我在Python中,并且我想在我的一个自定义类型上设置一个属性(例如Vector4),我的代码会为const char* attribute_name
参数获取一个空值(是的,我正在导入我的模块)。在
奇怪的是,当我在setter函数中硬编码属性名时,我得到了一个错误:
SystemError: error return without exception set
我确实看到了在Python(又在C++中)创建的对象,所以我不认为这是问题所在。如果StAtTro钩子确实在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 char*。pythonFunc是一个通用的python函数,它处理调用绑定到元系统的所有函数。classObj是指向PythonClass的指针,它有一个成员m_pyClassType(PyTypeObject的类型)。在
^ {CD11>}是一个新对象,它有两个conchar *和一个空隙*(这是C++中的对象)
我做PyType_Ready
并且没有错误,然后增加我的类型。然后我将这个对象添加到模块PyObject中,这个模块是从^{
如果需要更多信息/代码,我可以发布更多。我希望这有意义,这是我第一次在stackoverflow上发帖。在
为了澄清,我们希望在C++方面有完全解决的动态属性。对于函数,我希望能够重写PyObject* self
参数,这样我就可以得到需要调用的函数的字符串名。在
我们不想使用诸如Boost、Cython之类的第三方库/接口。在
问题出在我的getattro实现中。在
相关问题 更多 >
编程相关推荐