我正在为Python 3.x构建一个C扩展模块。我想访问Python层中hex
内置的功能。也就是说,我想转换(形成我的C代码)PyObject*
类型' PyLong_Type
' (即普通python int
)到PyObject*
PyUnicode_Type
类型int
,代表我开始的PyUnicode_FromFormat
的十六进制编码。
这看起来应该很容易,但functions in the integer section of the API guide似乎都没有这样做; functions in the string section中没有任何一个。请特别注意%S
并不能满足我的需求:
%R
或%x
格式说明符一起使用(您将获得十进制表示)PyObject*
格式说明符一起使用(您必须先将int
转换为C {{1}},这不是'安全的事情,因为Python整数可能太大而不适合。答案 0 :(得分:3)
这是hex
:
static PyObject *
builtin_hex(PyObject *self, PyObject *v)
{
return PyNumber_ToBase(v, 16);
}
它是static
,但实施建议了一种简单的方法来获得相同的功能:
return PyNumber_ToBase(your_number, 16);
PyNumber_ToBase
也存在于2.6和2.7中,但hex
并未在2.x行中使用它。
答案 1 :(得分:0)
回答我自己的问题,一种方法就是:
PyObject *fmt_string = PyUnicode_FromString("{0:x}");
if (!fmt_string)
return NULL;
PyObject *hex_rep_string = PyObject_CallMethodObjArgs(fmt_string, "format", int_obj);
Py_DECREF(fmt_string);
if (!hex_rep_string)
{
return NULL;
}
但似乎必须有更好/更规范的方式...