如何对PyObject *字符串使用基本的字符串操作?

时间:2019-05-27 03:24:55

标签: python python-c-api

我不想继续使用PyUnicode_DecodeUTF8PyUnicode_AsUTF8将每个Python字符串对象从PyObject*转换为std::stringchar*,因为这是一项昂贵的操作

在最后一个问题How to extend/reuse Python C Extensions/API implementation?上,我设法使用Python open函数直接给了我一个PyObject*字符串。完成此操作后,将字符串发送回Python程序非常简单,因为我只能将其PyObject*指针传递回来,而不是像PyUnicode_DecodeUTF8或{一样进行完整的逐字符复制{1}}做。

在CPython API的PyUnicode_AsUTF8实现中,我可以找到函数like this

regex

似乎没有使用static void* getstring(PyObject* string, Py_ssize_t* p_length, int* p_isbytes, int* p_charsize, Py_buffer *view) { /* given a python object, return a data pointer, a length (in characters), and a character size. return NULL if the object is not a string (or not compatible) */ /* Unicode objects do not support the buffer API. So, get the data directly. */ if (PyUnicode_Check(string)) { if (PyUnicode_READY(string) == -1) return NULL; *p_length = PyUnicode_GET_LENGTH(string); *p_charsize = PyUnicode_KIND(string); *p_isbytes = 0; return PyUnicode_DATA(string); } /* get pointer to byte string buffer */ if (PyObject_GetBuffer(string, view, PyBUF_SIMPLE) != 0) { PyErr_SetString(PyExc_TypeError, "expected string or bytes-like object"); return NULL; } *p_length = view->len; *p_charsize = 1; *p_isbytes = 1; if (view->buf == NULL) { PyErr_SetString(PyExc_ValueError, "Buffer is NULL"); PyBuffer_Release(view); view->buf = NULL; return NULL; } return view->buf; } PyUnicode_DecodeUTF8来处理来自Python解释器的PyUnicode_AsUTF8

如何将基本的字符串操作与PyObject*字符串一起使用而无需转换为PyObject*std::string

我将以下示例称为基本操作:(仅作为示例,我正在使用Py_BuildValue从字符串中将char*生成为PyObject*char*

std::string

0 个答案:

没有答案