-
-
Notifications
You must be signed in to change notification settings - Fork 29.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[C API] Add PyBytesWriter API #121710
Comments
Example creating the bytes string static PyObject* create_string(void)
{
char *str;
PyBytesWriter *writer = PyBytesWriter_Create(6, &str);
if (writer == NULL) {
return NULL;
}
if (PyBytesWriter_WriteBytes(writer, &str, "abc", 3) < 0) {
goto error;
}
if (PyBytesWriter_WriteBytes(writer, &str, "def", 3) < 0) {
goto error;
}
return PyBytesWriter_Finish(writer, str);
error:
PyBytesWriter_Discard(writer);
return NULL;
} Example creating the bytes string static PyObject *
test_byteswriter_prepare(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
{
char *str;
PyBytesWriter *writer = PyBytesWriter_Create(0, &str);
if (writer == NULL) {
return NULL;
}
if (PyBytesWriter_Prepare(writer, &str, 6) < 0) {
PyBytesWriter_Discard(writer);
return NULL;
}
memcpy(str, "Hello", 5);
str += 5;
*str++ = '.';
return PyBytesWriter_Finish(writer, str);
} |
The proposed public API is different than the private API: it allows to still use the writer when an error occurs, whereas the private API requires the function to discard the writer instance. The public API is also simpler to be less error-prone. |
Feature or enhancement
I propose adding a new
PyBytesWriter
API to create a Python bytes object.API:
The
PyBytesWriter
writer is responsible to manage memor and uses overallocation to be more efficient, str is a cursor to write into the bytes string.The implementation is based on the existing private
_PyBytesWriter
API which exists for many years and is used by many functions such as ASCII and Latin1 encoders,binascii
module,_pickle
module,_struct
module, bytes methods, etc.Linked PRs
The text was updated successfully, but these errors were encountered: