问题描述
我有一些代码在内部使用 PyDict 来存储数据。用户像使用普通的 Python 字典一样设置数据,数据由 C 代码存储在 PyDict 对象中。我的问题是:我需要引用计数 (Py_INCREF) 值和键吗?只是价值? documentation 表示调用 PyDict_SetItem 不会窃取值的引用。我的理解是,这意味着 PyDict 对象不负责值 PyObject,因此需要增加引用计数。文档中没有提到密钥 - 是否也需要递增?
一个相关的问题涉及我的代码的解除分配器 - 这些引用计数需要清理 - 是否有任何“捷径”来迭代 C API 中的可迭代对象并减少所有引用,或者我是否需要手动迭代PyDict 对象并单独递减所有值(可能还有键,取决于对上述内容的响应?)
有问题的代码看起来像这样(在评论中有问题):
int myobject_setitem(myobject *self,PyObject *key,PyObject *value) {
if (value) {
Py_INCREF(key); // <--- is this needed?
Py_INCREF(value);
return PyDict_SetItem(self->data,key,value);
}
/* I assume I need to look up the value so I can decrement the reference count
before removing it from the dictionary,right? */
PyObject *value = PyDict_GetItem(self->data,key);
if (!value) {
return -1;
}
int ret = PyDict_DelItem(self->data,key);
Py_DECREF(key); // <------- is this needed?
Py_DECREF(value);
return ret;
}
至于析构函数/解除分配器,我假设我只需要手动迭代字典并递减值(可能还有键?),除非有更好的方法? (要清楚我的意思是在 tp_dealloc 函数中)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)