Повышаю. Python поддерживает докстринги с автоматическим добавлением подписей Pythonic и C++. Эта функция реализована классом<function_doc_signature_generator>. Класс использует все перегрузки, поставляемые имена arg и значения по умолчанию, а также определяемые пользователем докстринги для создания документации для данной функции.
#include<boost/python/module.hpp>#include<boost/python/def.hpp>#include<boost/python/args.hpp>#include<boost/python/tuple.hpp>#include<boost/python/class.hpp>#include<boost/python/overloads.hpp>#include<boost/python/raw_function.hpp>usingnamespaceboost::python;tuplef(intx=1,doubley=4.25,charconst*z="wow"){returnmake_tuple(x,y,z);}BOOST_PYTHON_FUNCTION_OVERLOADS(f_overloads,f,0,3)structX{tuplef(intx=1,doubley=4.25,charconst*z="wow"){returnmake_tuple(x,y,z);}};BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_f_overloads,X::f,0,3)tupleraw_func(tupleargs,dictkw){returnmake_tuple(args,kw);}BOOST_PYTHON_MODULE(args_ext){def("f",f,(arg("x")=1,arg("y")=4.25,arg("z")="wow"),"This is f's docstring");def("raw",raw_function(raw_func));def("f1",f,f_overloads("f1's docstring",args("x","y","z")));class_<X>("X","This is X's docstring",init<>(args("self"))).def("f",&X::f,"This is X.f's docstring",args("self","x","y","z"));}
Для поддержки Pythonic-подписей преобразователи должны предоставить функцию<get_pytype>, возвращающую указатель на связанные<PyTypeObject>. См., например,<ResultConverter>или.<to_python_converter>. Классы в этом файле заголовка предназначены для использования при импликации<get_pytype>. Существуют также<_direct>версии шаблонов<classT>, которые должны использоваться с параметром неокрашенного типа, который, как ожидается, будет в реестре преобразования при загрузке модуля.
Этот шаблон должен использоваться с параметрами шаблона, которые являются (возможно, украшенными) типами, экспортируемыми на питон с использованием<class_>. Полученный статический<get_pytype>элемент возвращает соответствующий тип питона.
Этот шаблон генерирует статический<get_pytype>элемент, который проверяет зарегистрированные<from_python>преобразователи для типа<T>и возвращает соответствующий тип питона.
В этом примере предполагается, что кто-то внедрил стандартный модуль кивок из документации Python и поместил соответствующие декларации в «noddy.h». Поскольку<noddy_NoddyObject>является конечным тривиальным типом расширения, пример немного надуманный: он обертывает функцию, для которой вся информация содержится в типе ее обратного значения.
Определение модуля C++:
#include<boost/python/reference.hpp>#include<boost/python/module.hpp>#include"noddy.h"structtag{};tagmake_tag(){returntag();}usingnamespaceboost::python;structtag_to_noddy#ifdefinedBOOST_PYTHON_SUPPORTS_PY_SIGNATURES//unnecessary overhead if py signatures are not supported:wrap_pytype<&noddy_NoddyType>//inherits get_pytype from wrap_pytype#endif{staticPyObject*convert(tagconst&x){returnPyObject_New(noddy_NoddyObject,&noddy_NoddyType);}};BOOST_PYTHON_MODULE(to_python_converter){def("make_tag",make_tag);to_python_converter<tag,tag_to_noddy#ifdefinedBOOST_PYTHON_SUPPORTS_PY_SIGNATURES//invalid if py signatures are not supported,true#endif>();//"true" because tag_to_noddy has member get_pytype}
Следующий пример регистрируется в преобразователи Python и из них с использованием шаблонов expected_from_python_type и to_pyhton_target_type.
#include<boost/python/module.hpp>#include<boost/python/def.hpp>#include<boost/python/extract.hpp>#include<boost/python/to_python_converter.hpp>#include<boost/python/class.hpp>usingnamespaceboost::python;structA{};structB{Aa;B(constA&a_):a(a_){}};// Converter from A to python intstructBToPython#ifdefinedBOOST_PYTHON_SUPPORTS_PY_SIGNATURES//unnecessary overhead if py signatures are not supported:converter::to_python_target_type<A>//inherits get_pytype#endif{staticPyObject*convert(constB&b){returnincref(object(b.a).ptr());}};// Conversion from python int to AstructBFromPython{BFromPython(){boost::python::converter::registry::push_back(&convertible,&construct,type_id<B>()#ifdefinedBOOST_PYTHON_SUPPORTS_PY_SIGNATURES//invalid if py signatures are not supported,&converter::expected_from_python_type<A>::get_pytype//convertible to A can be converted to B#endif);}staticvoid*convertible(PyObject*obj_ptr){extract<constA&>ex(obj_ptr);if(!ex.check())return0;returnobj_ptr;}staticvoidconstruct(PyObject*obj_ptr,converter::rvalue_from_python_stage1_data*data){void*storage=((converter::rvalue_from_python_storage<B>*)data)->storage.bytes;extract<constA&>ex(obj_ptr);new(storage)B(ex());data->convertible=storage;}};Bfunc(constB&b){returnb;}BOOST_PYTHON_MODULE(pytype_function_ext){to_python_converter<B,BToPython#ifdefinedBOOST_PYTHON_SUPPORTS_PY_SIGNATURES//invalid if py signatures are not supported,true#endif>();//has get_pytypeBFromPython();class_<A>("A");def("func",&func);}>>>frompytype_function_extimport*>>>printfunc.__doc__func((A)arg1)->A:C++signature:structBfunc(structB)
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.