检查PyObjects C类型

时间:2011-05-23 22:41:15

标签: python c++ python-c-api

我正在使用Python 3.2和C ++。

我需要提取当前存储在PyObject中的C类型。 我已检查过文档并用Google搜索,似乎没有其他人需要这样做。

所以我有一个PyObject,并试图提取C值。我有实际需要从对象中提取值的函数列表,但我首先需要知道的是存储在对象本身中以调用正确的函数。

以防这有助于理解这里是我正在尝试的一些示例代码。

//Variable is a custom variant type to allow for generic functionality.
Variable ExtractArgument( PyObject * arg )
{
  Variable value;
  PyObject* result;
  //now here is the problem, I need to know which Python function to call in order to
  //extract the correct type;
  value = PyLong_FromLong( arg );
  //or 
  value = PyFloat_FromDouble( arg )
  //ect.
  return value;
}

希望我能看到类似这样的东西

Variable ExtractArgument( PyObject * arg )
{
  Variable value;
  PyObject* result;
  //PyType is not the actual variable to that holds the type_macro, GetType should be
  //replaced by the function I am trying to find 
  PyType type = GetType( arg ); 
  switch( type )
  { 
    case T_INT: value = static_cast<int>(PyLong_FromLong( arg  )); 
      break;
    case T_FLOAT: value = static_cast<float>(PyFloat_FromDouble( arg  ));
      break;
    case T_DOUBLE: value = PyDouble_FromDouble( arg );
      break;
    //ect.
  }
  return value;
} 

很抱歉,如果这个问题很长或太多信息。第一次发布,并不想留下任何可能有帮助的东西。 感谢您在此问题上给我的任何帮助或见解。

2 个答案:

答案 0 :(得分:5)

Python对象没有C类型,它们具有Python类型。例如,整数可以是C长整数或长整数。您可以使用PyInt_Check(obj)PyList_Check(obj)等检查类型。如果返回true,则表示您拥有该类型的对象。

请注意PyLong_FromLong等等。它们取一个C值并将其转换为PyObject *。所以你正在向后使用它们。我认为你的意思是PyInt_AsLong

答案 1 :(得分:1)

这不是Python类型的工作原理;它们不会一对一地映射到C类型。没有Python C / API函数可以告诉您特定值适合的C类型。但是,PyFloat_Check()PyInt_Check()等函数会检查类型(并考虑子类) 。)还有PyArg_ParseTuple()(及其变体)的说明符,它们告诉Python适当地转换传入的参数。

通常使用的是后者;使用PyArg_ParseTuple()解码传递给C函数的参数,如果需要以不同的方式处理不同的类型,则将它们作为不同的参数传递(通常作为命名参数。)目前尚不清楚该方法是否适合您。第二个最常见的事情是尝试使用不同的函数转换参数而不先进行类型检查,并在一个失败时尝试另一个转换函数。明确的类型检查通常是最不常见的选择。