首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有(非unicode)字符串的PyUnicode_FromFormat

带有(非unicode)字符串的PyUnicode_FromFormat
EN

Stack Overflow用户
提问于 2017-03-11 19:31:01
回答 1查看 618关注 0票数 1

我试图为类创建一个表示函数,并希望它与python-2.x和python-3.x兼容。但是,我注意到,当将普通字符串作为PyUnicode_FromFormat传递给%U时,会发生分段错误。我找到的唯一可行的解决方法是自己使用PyUnicode_FromObject将其转换为unicode对象,然后将结果传递给PyUnicode_FromFormat

代码语言:javascript
复制
/* 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兼容的同时,它能被简化吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-13 09:39:21

我不认为有一种非常简单的方式来做你想做的事。我所能看到的最好的方法是仅使用if大小写,从而始终调用PyUnicode_FromObject,从而消除PyUnicode_FromObject语句。

代码语言:javascript
复制
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的情况,它应该会稍微高效一些,因为您避免了分支。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42739653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档