我想用Py_LIMITED_API
美元.因此,我没有静态地定义我的Python类型,而是动态地定义它,规范和槽如下所示.
struct MyType { PyObject_HEAD };
static void MyType_dealloc( MyType * self ) { PyObject_DEL( self ); }
static PyObject * MyType_new( PyTypeObject * type, PyObject * args, PyObject * kwds ) {
return (PyObject *)PyObject_NEW( MyType, type );
}
static int MyType_init( MyType * self, PyObject * args, PyObject * kwds ) { return 0; }
static PyType_Slot MyType_slots[] = {
{ Py_tp_doc, (void *)PyDoc_STR("MyType objects") },
{ Py_tp_dealloc, (void *)&MyType_dealloc },
{ Py_tp_init, (void *)&MyType_init },
{ Py_tp_new, (void *)&MyType_new },
{ 0, NULL }
};
static PyType_Spec MyType_spec = {
"MyType",
sizeof(MyType),
0,
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
MyType_slots
};
static PyTypeObject * MyTypePtr = NULL;
static PyModuleDef MyModule = {
PyModuleDef_HEAD_INIT,
"MyModule",
"My C++ Module.",
-1,
NULL, NULL, NULL, NULL, NULL
};
PyMODINIT_FUNC
PyInit_MyModule(void)
{
PyObject* m = PyModule_Create( &MyModule );
if (m == NULL) return NULL;
MyTypePtr = (PyTypeObject*)PyType_FromSpec( &MyType_spec );
if ( MyTypePtr == NULL ) return NULL;
if ( PyType_Ready( MyTypePtr ) < 0 ) return NULL;
PyDict_SetItemString( MyTypePtr->tp_dict, "Normal", PyLong_FromLong( 0 ) );
PyDict_SetItemString( MyTypePtr->tp_dict, "Custom", PyLong_FromLong( 15 ) );
Py_INCREF( MyTypePtr );
PyModule_AddObject( m, "MyType", (PyObject *)MyTypePtr );
return m;
}
使用我的模块的这个定义,我可以编写以下代码.
from MyModule import *
print( MyType.Normal )
print( MyType.Custom )
我的问题是,对于Py_LIMITED_API
,我不能使用tp_dict
来定义常量值Normal
和Custom
.
我试着用PyType_GetSlot
,但Py_tp_dict
不存在.(我想我理解原因:这是因为它允许修改现有类型.)
现在我的问题是:在上面带有规格和槽的代码中,我如何定义类型MyType
的常量Normal
和Custom
而不使用tp_dict
?