PyObject *

时间:2018-11-19 15:27:24

标签: python c tcl

我比较2种语言...在C-API上的 Tcl Python ...与外部C-API函数交互...问题是const char*字符串-代表...

Tcl

Tcl_Obj *obj=…;
const char *str=Tcl_GetStringFromObj(obj,NULL);

strobj的一部分,并且与obj的生存期相同……dito…不需要清理

Python

PyObject *obj=…;
PyObject *strObj=PyObject_Str(obj);
const char *str=PyBytes_AsString(strObj);
Py_XDECREF(strObj);

strstrObj的一部分,需要清理Py_XDECREF(strObj)

用python清理是个问题,因为这需要古怪整理…因为str的生命周期取决于代码逻辑

即使我使用str做自己的OWN strstr副本,也必须清理我的OWN副本。

问题:PyObject字符串表示形式

的一般寿命是多少?

1 个答案:

答案 0 :(得分:1)

这是管理对象的字符串表示形式的两种不同方法。

来自Tcl docs for Tcl_GetStringFromObj

  

由返回的字节指针引用的存储空间由   对象管理器。

来自Python docs for PyObject_Str

  

返回值:新参考。计算对象的字符串表示形式   o。

因此,Python决定每次请求对象时就计算对象的字符串表示形式,并且调用PyObject_Str与调用Tcl_NewStringObj基本相同。这确实需要开发人员对返回的对象进行一些内存管理,但另一方面,这意味着您不必担心每次更改对象时都管理对象的内部字符串表示形式:只需计算字符串每次被请求。