python - 如何使用 pybind11 提供默认枚举值?

标签 python c++ enums default pybind11

我想让函数接受枚举默认参数。

但是我找不到在 PyBind11 enum example 中提供枚举默认值的正确方法是什么和文档,例如:

struct Pet
{
    enum Kind
    {
        Dog = 0,
        Cat
    };

    Pet(const std::string &name) : name(name)
    {
    }

    void setName(const std::string &name_)
    {
        name = name_;
    }

    const std::string &getName() const
    {
        return name;
    }

    Kind test(Kind kind = Dog)
    {
        if(kind == Dog)
           std::cout << "Dog" << std::endl;

        if(kind == Cat)
           std::cout << "Cat" << std::endl;

        return kind;
    }

    std::string name;
};

PYBIND11_MODULE(pet,m)
{
    py::class_<Pet> pet(m, "Pet");
    pet.def(py::init<const std::string &>())
       .def("setName", &Pet::setName)
       .def("getName", &Pet::getName)
       .def("test", &Pet::test, py::arg("kind") = Pet::Kind::Dog)
       .def("__repr__", [](const Pet &a) { return "<example.Pet named '" + a.name + "'>"; }
    );

    py::enum_<Pet::Kind>(pet, "Kind")
        .value("Dog", Pet::Kind::Dog)
        .value("Cat", Pet::Kind::Cat)
        .export_values();

但它不起作用:
py::arg("kind") = Pet::Kind::Dog 

当我在 Python 中运行它时,我遇到了错误。
from pet import Pet as p
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: arg(): could not convert default argument into a Python object (type not registered yet?). Compile in debug mode for more information.

我收到错误,当尝试使用字符串值初始化它时,即“Dog”或为 1。

最佳答案

这是一个简单的排序问题:在加载时,模块定义中的语句被执行以创建 Python 类、函数等。所以,定义 Kind首先(即在 Python 端)允许解释器在定义 test 时在设置默认值期间找到它稍后的。即,使用此顺序:

PYBIND11_MODULE(pet,m)
{
    py::class_<Pet> pet(m, "Pet");

    py::enum_<Pet::Kind>(pet, "Kind")
        .value("Dog", Pet::Kind::Dog)
        .value("Cat", Pet::Kind::Cat)
        .export_values();

    pet.def(py::init<const std::string &>())
       .def("setName", &Pet::setName)
       .def("getName", &Pet::getName)
       .def("test", &Pet::test, py::arg("kind") = Pet::Kind::Dog)
       .def("__repr__", [](const Pet &a) { return "<example.Pet named '" + a.name + "'>"; }
    );

}

关于python - 如何使用 pybind11 提供默认枚举值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59239271/

相关文章:

python - ManyToMany 字段引用期间的 Django NameError

c++ - "pthread_mutex_t mutex = {0}"是否初始化互斥量?

c++ - 使用 std::string 作为通用 uint8_t 缓冲区

python - __iter__ (迭代器和生成器)

python - Python 中传递给嵌套函数的参数

arrays - 使用关联值映射 swift 枚举

enums - 特征绑定(bind) io::Error: Clone is not satisfied when implementing a custom error enum

c# - 以十六进制值表示的 int 枚举

python - 在 matplotlib 的条形图中使用负值

C++正则表达式错误(未处理的异常)