从python C API调用'hex'内置函数

时间:2014-03-25 03:17:55

标签: python c

我正在为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整数可能太大而不适合。

2 个答案:

答案 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;
    }

但似乎必须有更好/更规范的方式...