2

使用 Boost Python,暴露给 python 的 C++ 函数是否可以根据传入的单个参数的值返回整数或字符串(或其他类型)?

所以在Python中我想这样做:

from my_module import get_property_value     

# get an integer property value
i = get_property_value("some_int_property")

# get a string 
s = get_property_value("some_string_property")

C++ 伪代码(显然它不会像这样工作,但你明白了)

???? getPropertyValue(const char* propertyName)
{
  Property *p = getProperty(propertyName);
  switch(p->type)
  {
    case INTEGER: return p->as_int();
    case STRING: return p->as_string();
    ...
  }
}


BOOST_PYTHON_MODULE(my_module)
{
  boost::python::def("get_property_value", &getPropertyValue);
}

如果有什么不同,我将 Boost 1.48 与 Python 3.2 一起使用。

4

4 回答 4

3

让 C++ 函数返回一个boost::python::object. 构造object函数将尝试将其参数转换为适当的 python 类型并管理对它的引用。例如,boost::python::object(42)将返回一个 Python 类型为int.


这是一个基本示例:

#include <boost/python.hpp>

/// @brief Get value, returning a python object based on the provided type
///        string.
boost::python::object get_value(const std::string& type)
{
  using boost::python::object;
  if      (type == "string") { return object("string 42"); }
  else if (type == "int")    { return object(42);          }
  return object(); // None
}

BOOST_PYTHON_MODULE(example)
{
  namespace python = boost::python;
  python::def("get_value", &get_value);
}

及其用法:

>>> import example
>>> x = example.get_value("string")
>>> x
'string 42'
>>> type(x)
<type 'str'>
>>> x = example.get_value("int")
>>> x
42
>>> type(x)
<type 'int'>
>>> x = example.get_value("")
>>> x
>>> type(x)
<type 'NoneType'>
于 2013-09-16T16:46:30.253 回答
2

我建议你让 C++ 函数返回一个object. 它必须在内部进行适当的转换。

于 2013-09-16T14:57:23.513 回答
0

这个怎么样?

string getPropertyValue(cont char* propertyName)
{
    // do some stuff
    if (someCondition)
    {
        return "^" + someInteger;
    }
    else
    {
        return someString; // if someString starts with the character '^', make
                           // it start with "^^" instead.
    }
}

然后在 Python 中,如果返回值不以 开头"^",则按原样将其用作字符串。否则,如果它以 开头"^^",则修剪其中一个,然后将其用作字符串。否则,从一"^"开始就修剪掉一个并将其用作 int。

于 2013-09-16T15:04:17.320 回答
-1

我不认为你可以在 c(或 c++)中做到这一点。更糟糕的是,您正在尝试使用函数指针——这意味着您甚至不能重载。

您可以做的是使用 property->as_int() 和 property->as_string() 的方法构建一个属性 类;

于 2013-09-16T14:59:28.343 回答