我实现了一个通用优先级队列,它将int
作为键,任何类实例作为元素;将这些任何称为节点。该算法将在python中进行原型化,但在C ++中实现。我试图找出python接口部分。这是C ++代码
queue.c ++
#include <Python.h>
#include <vector>
#include <iostream>
class PQueue
{
public:
PQueue()
{
Q = std::vector<PyObject *>();
}
void insert(PyObject *node)
{
Q.push_back(node);
std::cout << "Added a node" << std::endl;
}
private:
std::vector<PyObject *> Q;
};
extern "C"
{
PQueue *PQueue_new()
{ return new PQueue(); }
void PQueue_insert(PQueue *self, PyObject *n) /* This fails */
{ self->insert(n); }
}
这里是相应的python原型:
queue.py
import ctypes
lib = ctypes.cdll.LoadLibrary('./libqueue.so')
class PriorityQueue(object):
def __init__(self):
self.obj = lib.PQueue_new();
def insert(self, n): # this fails
lib.PQueue_insert(self.obj, n );
变量n
是表示节点的任意类实例。我想使用 PyObject_CallMethodObjArgs 访问n
的成员变量,但由于以下错误,我无法这样做:
lib.PQueue_insert(self.obj, n );
ctypes.ArgumentError: argument 2: <class 'TypeError'>: Don't know how to convert parameter 2
我认为python类不是C原语,但PyObject
存在的事实使我相信这样的事情应该是可能的。