PyUnicode_FromFormat 带有(非 unicode)字符串

PyUnicode_FromFormat with (not-unicode) strings

我尝试为 class 创建一个表示函数,我希望它与 python-2.x 和 python-3.x 兼容。但是我注意到传递给 PyUnicode_FromFormat as %U will segfault. The only viable workaround that I found was to convert it to a unicode object myself with 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 案例来消除 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,在这种情况下,它 returns 是原始版本的 increfed 版本目的。因此,完成的额外工作非常小(对于 key 已经是 unicode 的情况)并且在 key 不是 unicode 的情况下它应该稍微更有效率,因为你避免了分支。