使用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。
答案 0 :(得分:2)
我建议你让C ++函数返回object
。它必须在内部进行适当的转换。
答案 1 :(得分:2)
让C ++函数返回boost::python::object
。 object
构造函数将尝试
将其参数转换为适当的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(方法)的方法构建属性 类 );