python - 带有(非 unicode)字符串的 PyUnicode_FromFormat

标签 python c python-2.7 python-c-api

我尝试为一个类创建一个表示函数,我希望它与 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,在这种情况下,它会返回原始对象的 increfed 版本。因此,完成的额外工作非常小(对于 key 已经是 unicode 的情况)并且对于 key 不是 unicode 的情况,它应该稍微更有效率,因为你避开分支。

关于python - 带有(非 unicode)字符串的 PyUnicode_FromFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42739653/

相关文章:

Python 没有正确更新

python - 在 PyOpt 库中使用 SLSQP 求解器时出现类型错误

python - 获取 Pandas 数据框中所有唯一行的数量

python - 如何在json文件中查找和替换值的一部分

python-2.7 - OpenCV,网络摄像头窗口未打开

python - 从python调用外部程序

c - C 中结构体的大小

c - 简单的内联汇编程序无法编译

python - wxPython框架上的背景图像

python 一次循环遍历行数