从暴露给Python的C ++函数返回int或string

时间:2013-09-16 14:42:46

标签: c++ python-3.x boost-python

使用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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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


这是一个基本的例子:

#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'>

答案 2 :(得分: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。

答案 3 :(得分:-1)

我认为你不能用c(或c ++)来做这件事。更糟糕的是,您正在尝试使用函数指针 - 这意味着您甚至无法超载。

您可以做的是使用property-&gt; as_int()和property-&gt; as_string(方法)的方法构建属性 );