我尝试为一个类创建一个表示函数,我希望它与 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);
}
关键是我希望表示没有 ""
(或 ''
),如果我使用 %R
或 %S
。
我最近才发现这个问题,我到处都在使用 PyUnicode_FromFormat("%U", something);
所以我的问题是:这可以在保持 Python 的同时进行简化吗2.x 和 3.x 兼容吗?
最佳答案
我不认为存在一种非常简单的方法来做你想做的事。我能看到的最好的是通过仅使用您的 else
案例来消除 if
语句,从而始终调用 PyUnicode_FromObject
:
PyObject *tmp = PyUnicode_FromObject(key);
if (tmp == NULL) {
return NULL;
}
repr = PyUnicode_FromFormat("%U=%R", tmp, value);
Py_DECREF(tmp);
如果你看the implementation of PyUnicode_FromObject
您会看到它做的第一件事是 PyUnicode_CheckExact
,在这种情况下,它会返回原始对象的 incref
ed 版本。因此,完成的额外工作非常小(对于 key
已经是 unicode 的情况)并且对于 key
不是 unicode 的情况,它应该稍微更有效率,因为你避开分支。
关于python - 带有(非 unicode)字符串的 PyUnicode_FromFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42739653/