Я изучал, как Python представляет строку после PEP 393, и я не понимаю разницы между PyASCIIObject и PyCompactUnicodeObject.
Я понимаю, что строки представлены следующими структурами:
typedef struct {
PyObject_HEAD
Py_ssize_t length; /* Number of code points in the string */
Py_hash_t hash; /* Hash value; -1 if not set */
struct {
unsigned int interned:2;
unsigned int kind:3;
unsigned int compact:1;
unsigned int ascii:1;
unsigned int ready:1;
unsigned int :24;
} state;
wchar_t *wstr; /* wchar_t representation (null-terminated) */
} PyASCIIObject;
typedef struct {
PyASCIIObject _base;
Py_ssize_t utf8_length;
char *utf8;
Py_ssize_t wstr_length;
} PyCompactUnicodeObject;
typedef struct {
PyCompactUnicodeObject _base;
union {
void *any;
Py_UCS1 *latin1;
Py_UCS2 *ucs2;
Py_UCS4 *ucs4;
} data;
} PyUnicodeObject;
Поправьте меня, если я ошибаюсь, но я понимаю, что PyASCIIObject используется только для строк с символами ASCII, PyCompactUnicodeObject использует структуру PyASCIIObject и используется для строк с хотя бы одним символом, отличным от ASCII, а PyUnicodeObject - это используется для устаревших функций. Это правильно?
Кроме того, почему PyASCIIObject использует wchar_t? Разве символа недостаточно для представления строк ASCII? Кроме того, если PyASCIIObject уже имеет указатель wchar_t, почему PyCompactUnicodeObject также имеет указатель char? Насколько я понимаю, оба указателя указывают на одно и то же место, но зачем вам включать оба?