Я пытаюсь создать функцию представления для класса и хочу, чтобы она была совместима с python-2.x и python-3.x. Однако я заметил, что обычные строки при передаче в PyUnicode_FromFormat
поскольку %U
будет segfault. Единственный жизнеспособный обходной путь, который я нашел, заключался в том, чтобы самостоятельно преобразовать его в объект Unicode с помощью PyUnicode_FromObject
и затем передать результат в PyUnicode_FromFormat
:
/* key and value are arguments for the function. */
PyObject *repr;
if (PyUnicode_CheckExact(key)) {
repr = PyUnicode_FromFormat("%U=%R", key, value);
}
else {
PyObject *tmp = PyUnicode_FromObject(key);
if (tmp == NULL) {
return NULL;
}
repr = PyUnicode_FromFormat("%U=%R", tmp, value);
Py_DECREF(tmp);
}
Дело в том, что я хочу, чтобы представление было без ""
(или ''
), которые будут добавлены, если я использую %R
или %S
.
Я только недавно обнаружил проблему, и я использую PyUnicode_FromFormat("%U", something);
повсюду, поэтому у меня есть вопрос: можно ли это упростить, сохраняя при этом совместимость с Python 2.x и 3.x?
else
. ВызовPyUnicode_FromObject
для чего-то, что уже является объектом Unicode, просто выполняетincref
и возвращает объект обратно, поэтому вам не нужно много делать, чтобы всегда делать это. - person DavidW   schedule 13.03.2017