Смешивание преобразований типов и непрозрачных типов с помощью pybind11 - PullRequest
0 голосов
/ 30 сентября 2019

Я использую непрозрачные типы с pybind11. Например, я определил один для контейнера stl std::vector<uint32_t>, который является типом аргумента метода FromVec:

void FromVec(std::vector<uint32_t> vec);

PYBIND11_MAKE_OPAQUE(std::vector<uint32_t>);

PYBIND11_MODULE(tmap, m)
{
    py::bind_vector<std::vector<uint32_t>>(m, "VectorUint", 
      "Unsigned 32-bit int vector.");

    m.def("from_vec", &FromVec, py::arg("vec")
}

Теперь я могу (в Python) сделать следующее:

vec = VectorUint([2, 66, 262, 662, 26, 62])
from_vec(vec)

Однако преобразование типов больше не работает, поскольку функция теперь ожидает VectorUint и больше не принимает list, например:

l = [2, 66, 262, 662, 26, 62]
from_vec(l)

Есть ли способчтобы разрешить как косые типы, так и преобразование типов? То есть, когда передается list вместо наклонной границы VectorUint, он преобразуется в std::vector<uint32_t>, а не в Python, выдающий «несовместимые аргументы функции»?

1 Ответ

1 голос
/ 01 октября 2019

Если вам нужно автоматическое преобразование в std::vector из list, вы можете добавить такую ​​перегрузку в свой код привязки:

m.def("from_vec", &FromVec, py::arg("vec")); // accepts VectorUnit 
m.def("from_vec", [](py::list& list){ /* do conversion manually and call FromVec */ } ); // accepts python list
...