我试图为类创建一个表示函数,并希望它与python-2.x和python-3.x兼容。但是,我注意到,当将普通字符串作为PyUnicode_FromFormat传递给%U时,会发生分段错误。我找到的唯一可行的解决方法是自己使用PyUnicode_FromObject将其转换为unicode对象,然后将结果传递给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);
}要点是,如果使用""或%S,则希望表示不包含添加的%R (或'')。
我只是最近才发现这个问题,而且我在所有地方都在使用PyUnicode_FromFormat("%U", something);,所以我的问题是:在保持Python2.x和3.x兼容的同时,它能被简化吗?
发布于 2017-03-13 09:39:21
我不认为有一种非常简单的方式来做你想做的事。我所能看到的最好的方法是仅使用if大小写,从而始终调用PyUnicode_FromObject,从而消除PyUnicode_FromObject语句。
PyObject *tmp = PyUnicode_FromObject(key);
if (tmp == NULL) {
return NULL;
}
repr = PyUnicode_FromFormat("%U=%R", tmp, value);
Py_DECREF(tmp);如果您查看PyUnicode_FromObject,您将看到它所做的第一件事是PyUnicode_CheckExact,在这种情况下,它返回原始对象的incref编辑版本。因此,所做的额外工作非常小(对于key已经是unicode的情况),对于key不是unicode的情况,它应该会稍微高效一些,因为您避免了分支。
https://stackoverflow.com/questions/42739653
复制相似问题