我有一个带有四个参数的函数。这些参数中的两个可以独立地是int,int的向量或int的向量的向量(产生3 * 3 = 9个可能的组合)。现在,我正在为该函数编写python绑定,而不是编写多个重载,而是想编写一个使用动态类型检查涵盖所有这些可能组合的定义。
我认为可以通过将参数声明为py :: handle,然后使用py::instance
和py::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_width
和casted_constant_values
。如果我在每个if语句中初始化它们,那么它们将成为局部变量,并且无法在end语句中访问。如果我在每个if块中都写MoveArrayBody(Pad(Array{array}, casted_pad_width, pad_mode, casted_constant_values))
,那么将失去编写干净实现的目的。那么,解决这个问题的正确方法是什么?
(也是这是用于填充矩阵的填充函数)