You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

  1. 在Python包的MyPackage/__init__.py中,将core模块的类导入到包顶层:
    from .core import MyClass
    
  2. 在C++绑定代码中,设置类为非模块局部可见:
    #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");
    }
    
    结合Python端的导入,自动生成的文档字符串签名会变为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:25:26