我需要从python中创建一个现有的C ++类,所以我一直在探索使用Boost.Python与python直接提供的本机功能。我编写了Boost tutorial的第一个非平凡的例子:
struct World
{
World(std::string s) : msg(s) { }
void set(std::string m) { msg = m; }
std::string greet() { return msg; }
std::string msg;
};
通过我编码为的原生扩展名的等价物:
typedef struct {
PyObject_HEAD
std::string* msg;
} World;
例如,将greet()
和set()
实现为:
static PyObject* World_greet(World* self)
{
return Py_BuildValue("s", self->msg->c_str());
}
static PyObject* World_set(World* self, PyObject* args)
{
const char* msg = NULL;
if (PyArg_ParseTuple(args, "s", &msg)) {
self->msg->assign(msg);
Py_RETURN_NONE;
}
else {
return NULL;
}
}
这是使用World
实施PyObject
的正确方法吗?是否有更好的选择... msg
应该是std::string
,PyObject*
还是PyStringObject*
而不是std::string*
?如果它应该是其中之一 - 为什么以及World_greet()
和World_set()
与不同类型的内容会是什么样的?