5

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

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

所以我有一个 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;
} 

对不起,如果这个问题太长或信息太多。第一次发帖,不想留下任何可能有帮助的东西。感谢您在此问题上提供的任何帮助或见解。

4

2 回答 2

5

Python 对象没有 C 类型,它们有 Python 类型。例如,整数可以是 C long 或 long 整数。PyInt_Check(obj)您可以使用,等检查类型PyList_Check(obj)。如果返回 true,那么您知道您有一个该类型的对象。

请注意,PyLong_FromLong等等。他们获取一个 C 值并将其转换为 PyObject*。因此,您正在向后使用它们。我想你的意思是PyInt_AsLong

于 2011-05-23T22:52:16.487 回答
1

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

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

于 2011-05-23T22:52:50.270 回答