PyUnicode_FromFormat with(notunicode)字符串

2024-05-05 14:34:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试为一个类创建一个表示函数,我希望它与python-2.x和python-3.x兼容。不过,我注意到,当普通字符串作为%U传递给^{}时,它将出现错误。我找到的唯一可行的解决方法是使用^{}将其转换为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);,所以我的问题是:在保持python2.x和3.x兼容的同时,能否简化这个问题?在


Tags: 对象方法key函数字符串ifvalue错误
1条回答
网友
1楼 · 发布于 2024-05-05 14:34:16

我认为做你想做的事情不存在一个非常简单的方法。我能看到的最好的方法是消除if语句,只需使用else大小写,因此总是调用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_CheckExact,在这种情况下,它返回原始对象的increfed版本。因此,所做的额外工作非常小(对于key已经是unicode的情况),并且对于{}不是unicode的情况,它应该稍微更有效,因为您避免了分支。在

相关问题 更多 >