如何让PyBind11生成的文档字符串不含模块前缀?
解决PyBind11生成的文档字符串含冗长前缀问题
方法一:移除完整前缀,仅显示类名MyClass
有两种实现方式:
- 手动指定方法文档字符串:绑定方法时直接写入自定义签名和原有文档内容,覆盖自动生成的内容:
#include <pybind11/pybind11.h> namespace py = pybind11; class MyClass { public: void MyFun() {} }; PYBIND11_MODULE(core, m) { py::class_<MyClass>(m, "MyClass") .def(py::init<>()) .def("MyFun", &MyClass::MyFun, R"( test def MyFun(self: MyClass) -> None )"); } - 全局设置类型显示名称:通过PyBind11内部接口修改类型默认显示名称,让自动生成的签名使用短名称:
#include <pybind11/pybind11.h> namespace py = pybind11; class MyClass { public: void MyFun() {} }; PYBIND11_MODULE(core, m) { py::detail::type_name<MyClass>::set("MyClass"); py::class_<MyClass>(m, "MyClass") .def(py::init<>()) .def("MyFun", &MyClass::MyFun, "test"); }
方法二:移除.core.前缀,显示为MyPackage.MyClass
- 在Python包的
MyPackage/__init__.py中,将core模块的类导入到包顶层:from .core import MyClass - 在C++绑定代码中,设置类为非模块局部可见:
结合Python端的导入,自动生成的文档字符串签名会变为#include <pybind11/pybind11.h> namespace py = pybind11; class MyClass { public: void MyFun() {} }; PYBIND11_MODULE(core, m) { py::class_<MyClass>(m, "MyClass", py::module_local(false)) .def(py::init<>()) .def("MyFun", &MyClass::MyFun, "test"); }def MyFun(self: MyPackage.MyClass) -> None,移除了冗余的.core.部分。
额外技巧(PyBind11 2.7+)
使用较新版本的PyBind11时,可直接用py::signature参数指定方法签名:
.def("MyFun", &MyClass::MyFun, py::signature("(self: MyClass) -> None"), "test");
内容的提问来源于stack exchange,提问作者Finn Busch
相关产品推荐
相关产品推荐

