在pybind11

时间:2019-04-17 14:13:35

标签: python c++ pybind11

我有一个带有四个参数的函数。这些参数中的两个可以独立地是int,int的向量或int的向量的向量(产生3 * 3 = 9个可能的组合)。现在,我正在为该函数编写python绑定,而不是编写多个重载,而是想编写一个使用动态类型检查涵盖所有这些可能组合的定义。

我认为可以通过将参数声明为py :: handle,然后使用py::instancepy::cast来实现。所以我尝试了这样的事情

    m.def("pad",
          [](const ArrayBodyPtr& array, py::handle pad_width, const std::string& mode, py::handle constant_values) {
              PadMode pad_mode{};
              if (mode == "constant") {
                  pad_mode = PadMode::constant;
              } else {
                  throw py::value_error{"Currently only `constant` padding mode is supported"};
              }

              // pad_width : int64_t
              if (py::isinstance<int64_t>(pad_width)) {
                  casted_pad_width = py::cast<int64_t>(pad_width);
              }
              // pad_width : vector of int64_t
              if (py::isinstance<std::vector<int64_t>>(pad_width)){
                  casted_pad_width = py::cast<std::vector<int64_t>>(pad_width);
              }
              // pad_width : vector of vector of int64_t
              if (py::isinstance<std::vector<std::vector<<int64_t>>>(pad_width)){
                  casted_pad_width = py::cast<std::vector<std::vector<<int64_t>>>(pad_width);
              }
              // constant_values : Scalar
              if (py::isinstance<Scalar>(constant_values)) {
                  casted_constant_values = py::cast<Scalar>(constant_values);
              }
              // constant_values : vector of Scalar
              if (py::isinstance<std::vector<Scalar>>(constant_values)){
                  casted_constant_values = py::cast<std::vector<Scalar>>(constant_values);
              }
              // constant_values : vector of vector of Scalar
              if (py::isinstance<std::vector<std::vector<<Scalar>>>(constant_values)){
                  casted_constant_values = py::cast<std::vector<std::vector<<Scalar>>>(constant_values);
              }
              return MoveArrayBody(Pad(Array{array}, casted_pad_width, pad_mode, casted_constant_values));
          },
          py::arg("array"),
          py::arg("pad_width"),
          py::arg("mode"),
          py::arg("constant_values"));

但是现在,我不知道用什么类型来初始化变量casted_pad_widthcasted_constant_values。如果我在每个if语句中初始化它们,那么它们将成为局部变量,并且无法在end语句中访问。如果我在每个if块中都写MoveArrayBody(Pad(Array{array}, casted_pad_width, pad_mode, casted_constant_values)),那么将失去编写干净实现的目的。那么,解决这个问题的正确方法是什么?

(也是这是用于填充矩阵的填充函数)

0 个答案:

没有答案