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 是原始版本的 incref
ed 版本目的。因此,完成的额外工作非常小(对于 key
已经是 unicode 的情况)并且在 key
不是 unicode 的情况下它应该稍微更有效率,因为你避免了分支。
我尝试为 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 是原始版本的 incref
ed 版本目的。因此,完成的额外工作非常小(对于 key
已经是 unicode 的情况)并且在 key
不是 unicode 的情况下它应该稍微更有效率,因为你避免了分支。