pybind11 py::class_.def_property_readonly_static 不兼容函数参数 for () -> str



我正在尝试使用pybind11将C++类静态非参数方法绑定到python类静态常量字段。

这是我的示例代码config.cpp:


namespace py = pybind11;
struct Env {
static std::string env() {
return std::getenv("MY_ENV");
}
};
PYBIND11_MODULE(config, m) {
m.doc() = "my config module written in C++";
py::class_<Env>(m, "Env")
.def_property_readonly_static("ENV", &Env::env);
}

配置模块编译成功,但当我在python3控制台中使用它时,它引发了一个异常:

>>> from config import Env
>>> Env.ENV
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: (): incompatible function arguments. The following argument types are supported:
1. () -> str
Invoked with: <class 'config.Env'>

我应该如何解决这个问题?

或者有没有一种方法可以将C++函数绑定到python模块常量属性/变量?

下面是关于如何使用def_property_readonly_staticAPI将C++类静态非参数方法绑定到python类静态常量属性/变量的答案:https://pybind11.readthedocs.io/en/stable/advanced/classes.html#static-属性

关键是使用C++11 lambda,因此更新config.cpp中的PYBIND11_MODULE部分,如下所示:


PYBIND11_MODULE(config, m) {
m.doc() = "my config module written in C++";
py::class_<Env>(m, "Env")
.def_property_readonly_static("ENV", [](py::object /* self */){ return Env::env(); });
}

对于第二个问题,如何将C++非参数函数绑定到python常量属性/变量,我仍然不知道。

相关内容

  • 没有找到相关文章

最新更新