Add const T to docstring generation. (#3020)
* Add const T to docstring generation.
* Change order.
* See if existing test triggers for a const type.
* Add tests.
* Fix test.
* Remove experiment.
* Reformat.
* More tests, checks run.
* Adding `test_fmt_desc_` prefix to new test functions.
* Using pytest.mark.parametrize to 1. condense test; 2. exercise all functions even if one fails; 3. be less platform-specific (e.g. C++ float is not necessarily float32).
Co-authored-by: Ralf W. Grosse-Kunstleve <rwgk@google.com>
diff --git a/include/pybind11/numpy.h b/include/pybind11/numpy.h
index dd7f43d..ec4c53b 100644
--- a/include/pybind11/numpy.h
+++ b/include/pybind11/numpy.h
@@ -1029,7 +1029,10 @@
template <typename T>
struct npy_format_descriptor_name<T, enable_if_t<std::is_floating_point<T>::value>> {
- static constexpr auto name = _<std::is_same<T, float>::value || std::is_same<T, double>::value>(
+ static constexpr auto name = _<std::is_same<T, float>::value
+ || std::is_same<T, const float>::value
+ || std::is_same<T, double>::value
+ || std::is_same<T, const double>::value>(
_("numpy.float") + _<sizeof(T)*8>(), _("numpy.longdouble")
);
};
@@ -1037,7 +1040,9 @@
template <typename T>
struct npy_format_descriptor_name<T, enable_if_t<is_complex<T>::value>> {
static constexpr auto name = _<std::is_same<typename T::value_type, float>::value
- || std::is_same<typename T::value_type, double>::value>(
+ || std::is_same<typename T::value_type, const float>::value
+ || std::is_same<typename T::value_type, double>::value
+ || std::is_same<typename T::value_type, const double>::value>(
_("numpy.complex") + _<sizeof(typename T::value_type)*16>(), _("numpy.longcomplex")
);
};
diff --git a/tests/test_numpy_array.cpp b/tests/test_numpy_array.cpp
index dca7145..204ea83 100644
--- a/tests/test_numpy_array.cpp
+++ b/tests/test_numpy_array.cpp
@@ -437,4 +437,10 @@
sm.def("accept_double_f_style_forcecast_noconvert",
[](py::array_t<double, py::array::forcecast | py::array::f_style>) {},
"a"_a.noconvert());
+
+ // Check that types returns correct npy format descriptor
+ sm.def("test_fmt_desc_float", [](py::array_t<float>) {});
+ sm.def("test_fmt_desc_double", [](py::array_t<double>) {});
+ sm.def("test_fmt_desc_const_float", [](py::array_t<const float>) {});
+ sm.def("test_fmt_desc_const_double", [](py::array_t<const double>) {});
}
diff --git a/tests/test_numpy_array.py b/tests/test_numpy_array.py
index 02f3ecf..548c84b 100644
--- a/tests/test_numpy_array.py
+++ b/tests/test_numpy_array.py
@@ -482,6 +482,19 @@
assert a.shape == (6,)
+@pytest.mark.parametrize(
+ "test_func",
+ [
+ m.test_fmt_desc_float,
+ m.test_fmt_desc_double,
+ m.test_fmt_desc_const_float,
+ m.test_fmt_desc_const_double,
+ ],
+)
+def test_format_descriptors_for_floating_point_types(test_func):
+ assert "numpy.ndarray[numpy.float" in test_func.__doc__
+
+
@pytest.mark.parametrize("forcecast", [False, True])
@pytest.mark.parametrize("contiguity", [None, "C", "F"])
@pytest.mark.parametrize("noconvert", [False, True])