mirror of
https://github.com/pybind/pybind11.git
synced 2026-05-13 01:36:21 +00:00
Merge branch 'master' into sh_merge_master
This commit is contained in:
@@ -695,7 +695,7 @@ public:
|
||||
}
|
||||
|
||||
static constexpr auto name
|
||||
= const_name("Tuple[") + concat(make_caster<Ts>::name...) + const_name("]");
|
||||
= const_name("tuple[") + concat(make_caster<Ts>::name...) + const_name("]");
|
||||
|
||||
template <typename T>
|
||||
using cast_op_type = type;
|
||||
@@ -920,6 +920,10 @@ struct handle_type_name<bytes> {
|
||||
static constexpr auto name = const_name(PYBIND11_BYTES_NAME);
|
||||
};
|
||||
template <>
|
||||
struct handle_type_name<buffer> {
|
||||
static constexpr auto name = const_name("Buffer");
|
||||
};
|
||||
template <>
|
||||
struct handle_type_name<int_> {
|
||||
static constexpr auto name = const_name("int");
|
||||
};
|
||||
@@ -940,10 +944,18 @@ struct handle_type_name<function> {
|
||||
static constexpr auto name = const_name("Callable");
|
||||
};
|
||||
template <>
|
||||
struct handle_type_name<handle> {
|
||||
static constexpr auto name = handle_type_name<object>::name;
|
||||
};
|
||||
template <>
|
||||
struct handle_type_name<none> {
|
||||
static constexpr auto name = const_name("None");
|
||||
};
|
||||
template <>
|
||||
struct handle_type_name<sequence> {
|
||||
static constexpr auto name = const_name("Sequence");
|
||||
};
|
||||
template <>
|
||||
struct handle_type_name<args> {
|
||||
static constexpr auto name = const_name("*args");
|
||||
};
|
||||
|
||||
@@ -66,7 +66,7 @@ constexpr bool is_alias(void *) {
|
||||
}
|
||||
|
||||
// Constructs and returns a new object; if the given arguments don't map to a constructor, we fall
|
||||
// back to brace aggregate initiailization so that for aggregate initialization can be used with
|
||||
// back to brace aggregate initialization so that for aggregate initialization can be used with
|
||||
// py::init, e.g. `py::init<int, int>` to initialize a `struct T { int a; int b; }`. For
|
||||
// non-aggregate types, we need to use an ordinary T(...) constructor (invoking as `T{...}` usually
|
||||
// works, but will not do the expected thing when `T` has an `initializer_list<T>` constructor).
|
||||
|
||||
@@ -462,6 +462,7 @@ inline object get_python_state_dict() {
|
||||
#endif
|
||||
if (!state_dict) {
|
||||
raise_from(PyExc_SystemError, "pybind11::detail::get_python_state_dict() FAILED");
|
||||
throw error_already_set();
|
||||
}
|
||||
return state_dict;
|
||||
}
|
||||
@@ -474,6 +475,7 @@ inline internals **get_internals_pp_from_capsule(handle obj) {
|
||||
void *raw_ptr = PyCapsule_GetPointer(obj.ptr(), /*name=*/nullptr);
|
||||
if (raw_ptr == nullptr) {
|
||||
raise_from(PyExc_SystemError, "pybind11::detail::get_internals_pp_from_capsule() FAILED");
|
||||
throw error_already_set();
|
||||
}
|
||||
return static_cast<internals **>(raw_ptr);
|
||||
}
|
||||
|
||||
@@ -120,6 +120,20 @@ inline numpy_internals &get_numpy_internals() {
|
||||
return *ptr;
|
||||
}
|
||||
|
||||
PYBIND11_NOINLINE module_ import_numpy_core_submodule(const char *submodule_name) {
|
||||
module_ numpy = module_::import("numpy");
|
||||
str version_string = numpy.attr("__version__");
|
||||
|
||||
module_ numpy_lib = module_::import("numpy.lib");
|
||||
object numpy_version = numpy_lib.attr("NumpyVersion")(version_string);
|
||||
int major_version = numpy_version.attr("major").cast<int>();
|
||||
|
||||
/* `numpy.core` was renamed to `numpy._core` in NumPy 2.0 as it officially
|
||||
became a private module. */
|
||||
std::string numpy_core_path = major_version >= 2 ? "numpy._core" : "numpy.core";
|
||||
return module_::import((numpy_core_path + "." + submodule_name).c_str());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
struct same_size {
|
||||
template <typename U>
|
||||
@@ -263,9 +277,13 @@ private:
|
||||
};
|
||||
|
||||
static npy_api lookup() {
|
||||
module_ m = module_::import("numpy.core.multiarray");
|
||||
module_ m = detail::import_numpy_core_submodule("multiarray");
|
||||
auto c = m.attr("_ARRAY_API");
|
||||
void **api_ptr = (void **) PyCapsule_GetPointer(c.ptr(), nullptr);
|
||||
if (api_ptr == nullptr) {
|
||||
raise_from(PyExc_SystemError, "FAILURE obtaining numpy _ARRAY_API pointer.");
|
||||
throw error_already_set();
|
||||
}
|
||||
npy_api api;
|
||||
#define DECL_NPY_API(Func) api.Func##_ = (decltype(api.Func##_)) api_ptr[API_##Func];
|
||||
DECL_NPY_API(PyArray_GetNDArrayCFeatureVersion);
|
||||
@@ -626,11 +644,8 @@ public:
|
||||
|
||||
private:
|
||||
static object _dtype_from_pep3118() {
|
||||
static PyObject *obj = module_::import("numpy.core._internal")
|
||||
.attr("_dtype_from_pep3118")
|
||||
.cast<object>()
|
||||
.release()
|
||||
.ptr();
|
||||
module_ m = detail::import_numpy_core_submodule("_internal");
|
||||
static PyObject *obj = m.attr("_dtype_from_pep3118").cast<object>().release().ptr();
|
||||
return reinterpret_borrow<object>(obj);
|
||||
}
|
||||
|
||||
|
||||
@@ -58,11 +58,13 @@ inline std::string replace_newlines_and_squash(const char *text) {
|
||||
std::string result(text);
|
||||
bool previous_is_whitespace = false;
|
||||
|
||||
// Do not modify string representations
|
||||
char first_char = result[0];
|
||||
char last_char = result[result.size() - 1];
|
||||
if (first_char == last_char && first_char == '\'') {
|
||||
return result;
|
||||
if (result.size() >= 2) {
|
||||
// Do not modify string representations
|
||||
char first_char = result[0];
|
||||
char last_char = result[result.size() - 1];
|
||||
if (first_char == last_char && first_char == '\'') {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
result.clear();
|
||||
|
||||
@@ -1141,7 +1143,7 @@ protected:
|
||||
}
|
||||
msg += "kwargs: ";
|
||||
bool first = true;
|
||||
for (auto kwarg : kwargs) {
|
||||
for (const auto &kwarg : kwargs) {
|
||||
if (first) {
|
||||
first = false;
|
||||
} else {
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
return s.release();
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(type, const_name("Set[") + key_conv::name + const_name("]"));
|
||||
PYBIND11_TYPE_CASTER(type, const_name("set[") + key_conv::name + const_name("]"));
|
||||
};
|
||||
|
||||
template <typename Type, typename Key, typename Value>
|
||||
@@ -157,7 +157,7 @@ public:
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(Type,
|
||||
const_name("Dict[") + key_conv::name + const_name(", ") + value_conv::name
|
||||
const_name("dict[") + key_conv::name + const_name(", ") + value_conv::name
|
||||
+ const_name("]"));
|
||||
};
|
||||
|
||||
@@ -208,7 +208,7 @@ public:
|
||||
return l.release();
|
||||
}
|
||||
|
||||
PYBIND11_TYPE_CASTER(Type, const_name("List[") + value_conv::name + const_name("]"));
|
||||
PYBIND11_TYPE_CASTER(Type, const_name("list[") + value_conv::name + const_name("]"));
|
||||
};
|
||||
|
||||
template <typename Type, typename Alloc>
|
||||
@@ -274,7 +274,7 @@ public:
|
||||
|
||||
PYBIND11_TYPE_CASTER(ArrayType,
|
||||
const_name<Resizable>(const_name(""), const_name("Annotated["))
|
||||
+ const_name("List[") + value_conv::name + const_name("]")
|
||||
+ const_name("list[") + value_conv::name + const_name("]")
|
||||
+ const_name<Resizable>(const_name(""),
|
||||
const_name(", FixedSize(")
|
||||
+ const_name<Size>() + const_name(")]")));
|
||||
|
||||
@@ -45,6 +45,16 @@ class Set : public set {
|
||||
using set::set;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class Iterable : public iterable {
|
||||
using iterable::iterable;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class Iterator : public iterator {
|
||||
using iterator::iterator;
|
||||
};
|
||||
|
||||
template <typename Signature>
|
||||
class Callable;
|
||||
|
||||
@@ -85,6 +95,16 @@ struct handle_type_name<typing::Set<T>> {
|
||||
static constexpr auto name = const_name("set[") + make_caster<T>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::Iterable<T>> {
|
||||
static constexpr auto name = const_name("Iterable[") + make_caster<T>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct handle_type_name<typing::Iterator<T>> {
|
||||
static constexpr auto name = const_name("Iterator[") + make_caster<T>::name + const_name("]");
|
||||
};
|
||||
|
||||
template <typename Return, typename... Args>
|
||||
struct handle_type_name<typing::Callable<Return(Args...)>> {
|
||||
using retval_type = conditional_t<std::is_same<Return, void>::value, void_type, Return>;
|
||||
|
||||
Reference in New Issue
Block a user