In reviewing issue 13604 (aligning PEP 393 with the implementation) Victor Stinner noticed that PyUnicode_AsUnicodeAndSize is new in 3.3, but that it is already deprecated (because it relies on the old PyUnicode type). This born-deprecated function is just a shortcut for PyUnicode_AsUnicode plus PyUnicode_GET_SIZE, and should be removed.
It is now a useful function, as PyUnicode_AsUnicode defers to it. It is still born-deprecated, but that may be unavoidable, as all use of the wstr format is deprecated.
The Py_UNICODE* type is deprecated but since Python 3.3, Py_UNICODE=wchar_t and wchar_t* is a common type on Windows. PyUnicode_AsUnicodeAndSize() is used to encode Python strings to call Windows functions. PyUnicode_AsUnicodeAndSize() is preferred over PyUnicode_AsWideCharString() because PyUnicode_AsWideCharString() stores the result in the Unicode string and the Unicode string releases the memory automatically later. Calling PyUnicode_AsWideCharString() twice on the same string avoids also the need of encoding the string twice because the result is cached. I proposed to add a new function using wchar_*t and storing the result in the Unicode string, but the idea was rejected. I don't remember why.
STINNER Victor wrote: > > STINNER Victor <victor.stinner@gmail.com> added the comment: > > The Py_UNICODE* type is deprecated but since Python 3.3, Py_UNICODE=wchar_t and wchar_t* is a common type on Windows. PyUnicode_AsUnicodeAndSize() is used to encode Python strings to call Windows functions. > > PyUnicode_AsUnicodeAndSize() is preferred over PyUnicode_AsWideCharString() because PyUnicode_AsWideCharString() stores the result in the Unicode string and the Unicode string releases the memory automatically later. Calling PyUnicode_AsWideCharString() twice on the same string avoids also the need of encoding the string twice because the result is cached. > > I proposed to add a new function using wchar_*t and storing the result in the Unicode string, but the idea was rejected. I don't remember why. Could you please clarify what you actually intend to do ? Which function do you want to remove and why ? The title and description of this ticket don't match :-)