Pri použití funkcie Boost :: Python normálny mechanizmus pre obtiažne funkcie pracuje správne s návratom funkcií C ++ void
, Bohužiaľ, normálny mechanizmus tiež existujeobmedzenia, najmä s ohľadom na funkčnosť, ktorú podporuje. Aby som zabalil svoju funkciu, musím použiť boost :: python :: raw_function, ale keď sa moja funkcia vráti, nebude sa kompilovať. void
, Tu je jednoduchý skúšobný prípad:
#include <boost/python.hpp>
#include <boost/python/raw_function.hpp>
void entry_point(boost::python::tuple args, boost::python::dict kwargs) { }
BOOST_PYTHON_MODULE(module)
{
boost::python::def("entry_point", boost::python::raw_function(&entry_point));
}
Čo dáva chybu:
/ Usr / local / include / posilnenie / Python / raw_function.hpp: Vo funkcii člena 'PyObject * boost :: python :: detail :: raw_dispatcher :: operator () (PyObject *, PyObject *) [s F = void (*) (boost :: python :: tuple, boost :: python :: dict)]:
/usr/local/include/boost/python/object/py_function.hpp:94: instantiate od 'PyObject * boost :: python :: objects :: full_py_function_impl :: operator () (PyObject *, PyObject *) [with Caller = boost :: python :: detail :: raw_dispatcher, Sig = boost :: mpl :: vector1] '
void.cpp: 8: okamžité odtiaľto
/usr/local/include/boost/python/raw_function.hpp:36: chyba: neplatné použitie neplatného výrazu
Momentálne to môžem obísť tak, že moja funkcia vráti falošnú hodnotu, ale je to trochu neuspokojivé. Došli k tomuto problému ostatní ľudia?
odpovede:
2 pre odpoveď č. 1Myslím si, že to tak je raw_function()
funguje. Očakáva, že vaša funkcia vráti objekt Python.
V Pythone sa najbližšie dostanete k funkcii, ktorá sa vracia void
je funkcia vracajúca sa None
, Myslím si, že tento prístup by bol vo vašom prípade najlepší (a nie dokonca taký škaredý):
#include <boost/python.hpp>
#include <boost/python/raw_function.hpp>
using namespace boost::python;
namespace
{
object entry_point(tuple args, dict kwargs)
{
return object();
}
}
BOOST_PYTHON_MODULE(foo)
{
def("entry_point", raw_function(&entry_point));
}