Python函数在C++;
我正试图使用Boost.python在python中公开eigen3 我找不到方法公开Python函数在C++;,python,c++,c,boost,boost-python,Python,C++,C,Boost,Boost Python,我正试图使用Boost.python在python中公开eigen3 我找不到方法公开unaryExpr(const CustomUnaryOp&func=CustomUnaryOp()) 我想要的是能让我拥有这样的东西: void unary_expr(Matrix const& self, PyObject* callable_object) { cpp_callable = ??(callable_object) self.unaryEpxr(cpp_callable)
unaryExpr(const CustomUnaryOp&func=CustomUnaryOp())
我想要的是能让我拥有这样的东西:
void unary_expr(Matrix const& self, PyObject* callable_object)
{
cpp_callable = ??(callable_object)
self.unaryEpxr(cpp_callable);
}
蟒蛇
import libMatrix as mat
a = mat.Matrix(10, 10)
mat.unary_expr( lambda x : 1)
你知道吗??可能是这样的:
void unary_expr(Matrix const& self, PyObject* callable_object)
{
cpp_callable = ??(callable_object)
self.unaryEpxr(cpp_callable);
}
==我试过的:==========================================
1) 我尝试使用一个简单的回调定义
typedef double(*UnaryExprType)(double);
void unary_expr(Matrix const& self, UnaryExprType a);
{
self.unaryEpxr( a );
}
但是boost并没有将python函数转换为一个unaryExprtType
2)我尝试过<代码> PythonCallBack <代码>,但是它不起作用,我有一个错误,即Python签名与C++签名不匹配。
struct PythonCallBackBase
{
public:
virtual ~PythonCallBackBase() {}
virtual double operator() (double const & x) { return 0; }
};
struct PythonCallBack : PythonCallBackBase, boost::python::wrapper<PythonCallBackBase>
{
public:
typedef boost::python::wrapper<PythonCallBackBase> wrap;
double default_op(double const & x)
{
return 0;
}
double operator() (double const & x)
{
if (boost::python::override f = wrap::get_override("__call__"))
return f(x);
return PythonCallBackBase::operator ()(x);
}
};
void unary_expr(Matrix const& self, PythonCallBack a)
{
self.unaryEpxr( a );
}
struct PythonCallBackBase
{
公众:
虚拟~PythonCallBackBase(){}
虚拟双运算符()(双常量&x){return 0;}
};
结构PythonCallBack:PythonCallBackBase,boost::python::wrapper
{
公众:
typedef boost::python::wrapper wrap;
双默认值(双常量和x)
{
返回0;
}
双运算符()(双常量和x)
{
if(boost::python::override f=wrap::get_override(“\u_调用\u”))
返回f(x);
返回PythonCallBackBase::operator()(x);
}
};
void一元表达式(矩阵常量和自我,蟒蛇背甲)
{
self.unaryEpxr(a);
}
错误消息
ArgumentError: Python argument types in
Matrix.unary_expr(Matrix, Boost.Python.class)
did not match C++ signature:
unary_expr(Eigen::Matrix<double, -1, -1, 0, -1, -1>, PythonCallBack)
unary_expr(Eigen::Matrix<double, -1, -1, 0, -1, -1>, double (*)(double))
ArgumentError:中的Python参数类型
一元表达式(矩阵,Boost.Python.class)
与C++签名不匹配:
一元表达式(特征::矩阵,PythonCallBack)
一元表达式(本征::矩阵,双(*)(双))
Boost.Python的设计目的是最大限度地减少与PyObject
交互的需要,人们通常可以简单地使用Boost::Python::object
,就像使用Python中的对象一样。例如,如果func
是一个引用了lambda x:1
,那么下面是带注释的Python注释的Boost.Python用法:
func=lambda x:1
boost::python::object func=。。。;
//>>>结果=函数(42)
boost::python::object result=func(42);
//>>>断言(1==结果)
断言(1==boost::python::extract(result));
在此情况下,由于C++代码可能希望函子的返回值是C++类型而不是通用的代码> Boo::Python::对象< /C> >,可以使用包装类型来适应函子。< /P> 将Boost.Python对象适配到 ///具有显式返回类型的一元函子。 模板 类py_一元函子 { 公众: typedef Arg参数类型; typedef结果类型; py_一元函数(boost::python::object) :对象(对象) {} 结果类型运算符()(参数类型a1) { 返回boost::python::extract(object_u1;(a1))(); } 私人: boost::python::object\uuz; };
下面是一个完整的最小示例:
#包括
///@brief-Mockup-matrix类。
结构矩阵
{
模板
void unaryExpr(CustomUnaryOp func)
{
值=func(值);
}
双重价值;
};
///@brief辅助类型,用于将Boost.Python对象适配到
///具有显式返回类型的一元函子。
模板
类py_一元函子
{
公众:
typedef Arg参数类型;
typedef结果类型;
py_一元函数(boost::python::object)
:对象(对象)
{}
结果类型运算符()(参数类型a1)
{
返回boost::python::extract(object_u1;(a1))();
}
私人:
boost::python::object\uuz;
};
///@用于调整矩阵的简短辅助函数::unaryExpr。
空洞矩阵(
矩阵与自我,
boost::python::object(对象)
{
py_一元函数func(object);
返回self.unaryExpr(func);
}
BOOST_PYTHON_模块(示例)
{
名称空间python=boost::python;
python::class_389;(“矩阵”)
//公开辅助功能。
.def(“unaryExpr”&矩阵_unaryExpr)
.add_属性(“值”、&matrix::value、&matrix::value)
;
}
互动使用:
>>导入示例
>>>矩阵=示例。矩阵()
>>>矩阵值=21
>>>断言(21==矩阵值)
>>>矩阵.unaryExpr(λx:x*2)
>>>断言(42==矩阵值)
这似乎是不可能的。