10#include <pybind11/functional.h>
21 m.def(
"test_callback1", [](
const py::object &func) {
return func(); });
22 m.def(
"test_callback2", [](
const py::object &func) {
return func(
"Hello",
'x',
true, 5); });
23 m.def(
"test_callback3", [](
const std::function<
int(
int)> &func) {
24 return "func(43) = " + std::to_string(func(43));
26 m.def(
"test_callback4",
27 []() -> std::function<int(
int)> {
return [](
int i) {
return i + 1; }; });
28 m.def(
"test_callback5",
29 []() {
return py::cpp_function([](
int i) {
return i + 1; }, py::arg(
"number")); });
32 m.def(
"test_tuple_unpacking", [](
const py::function &f) {
33 auto t1 = py::make_tuple(2, 3);
34 auto t2 = py::make_tuple(5, 6);
35 return f(
"positional", 1, *t1, 4, *t2);
38 m.def(
"test_dict_unpacking", [](
const py::function &f) {
39 auto d1 = py::dict(
"key"_a =
"value",
"a"_a = 1);
41 auto d3 = py::dict(
"b"_a = 2);
42 return f(
"positional", 1, **d1, **d2, **d3);
45 m.def(
"test_keyword_args", [](
const py::function &f) {
return f(
"x"_a = 10,
"y"_a = 20); });
47 m.def(
"test_unpacking_and_keywords1", [](
const py::function &f) {
48 auto args = py::make_tuple(2);
49 auto kwargs = py::dict(
"d"_a = 4);
53 m.def(
"test_unpacking_and_keywords2", [](
const py::function &f) {
54 auto kwargs1 = py::dict(
"a"_a = 1);
55 auto kwargs2 = py::dict(
"c"_a = 3,
"d"_a = 4);
56 return f(
"positional",
59 *py::make_tuple(3, 4),
68 m.def(
"test_unpacking_error1", [](
const py::function &f) {
69 auto kwargs = py::dict(
"x"_a = 3);
70 return f(
"x"_a = 1,
"y"_a = 2, **
kwargs);
73 m.def(
"test_unpacking_error2", [](
const py::function &f) {
74 auto kwargs = py::dict(
"x"_a = 3);
75 return f(**
kwargs,
"x"_a = 1);
78 m.def(
"test_arg_conversion_error1",
81 m.def(
"test_arg_conversion_error2", [](
const py::function &f) {
93 m.def(
"payload_cstats", &ConstructorStats::get<Payload>);
94 m.def(
"test_lambda_closure_cleanup", []() -> std::function<
void()> {
114 m.def(
"test_cpp_callable_cleanup", []() {
117 py::list alive_counts;
119 alive_counts.append(stat.
alive());
121 CppCallable cpp_callable;
122 alive_counts.append(stat.
alive());
127 py::cpp_function py_func(cpp_callable);
128 py::detail::silence_unused_warnings(py_func);
129 alive_counts.append(stat.
alive());
131 alive_counts.append(stat.
alive());
133 py::cpp_function py_func(std::move(cpp_callable));
134 py::detail::silence_unused_warnings(py_func);
135 alive_counts.append(stat.
alive());
137 alive_counts.append(stat.
alive());
139 alive_counts.append(stat.
alive());
146 m.def(
"dummy_function_overloaded", [](
int i,
int j) {
return i + j; });
148 m.def(
"dummy_function2", [](
int i,
int j) {
return i + j; });
151 [](std::function<
int(
int)> f,
bool expect_none =
false) {
152 if (expect_none && f) {
153 throw std::runtime_error(
"Expected None to be converted to empty std::function");
158 py::arg(
"expect_none") =
false);
159 m.def(
"test_dummy_function", [](
const std::function<
int(
int)> &f) -> std::string {
160 using fn_type = int (*)(int);
161 const auto *result = f.target<fn_type>();
164 return "can't convert to function pointer: eval(1) = " + std::to_string(r);
167 auto r = (*result)(1);
168 return "matches dummy_function: eval(1) = " + std::to_string(r);
170 return "argument does NOT match dummy_function. This should never happen!";
178 virtual ~AbstractBase() {}
179 virtual unsigned int func() = 0;
181 m.def(
"func_accepting_func_accepting_base",
182 [](
const std::function<
double(AbstractBase &)> &) {});
184 struct MovableObject {
187 MovableObject() =
default;
188 MovableObject(
const MovableObject &) =
default;
189 MovableObject &operator=(
const MovableObject &) =
default;
190 MovableObject(MovableObject &&o) noexcept : valid(o.valid) { o.valid =
false; }
191 MovableObject &operator=(MovableObject &&o)
noexcept {
197 py::class_<MovableObject>(m,
"MovableObject");
200 m.def(
"callback_with_movable", [](
const std::function<
void(MovableObject &)> &f) {
201 auto x = MovableObject();
207 struct CppBoundMethodTest {};
208 py::class_<CppBoundMethodTest>(m,
"CppBoundMethodTest")
210 .def(
"triple", [](CppBoundMethodTest &,
int val) {
return 3 * val; });
214 m.def(
"test_sum_builtin",
215 [](
const std::function<
double(py::iterable)> &sum_builtin,
const py::iterable &i) {
216 return sum_builtin(i);
220 using callback_f = std::function<void(
int)>;
221 m.def(
"test_async_callback", [](
const callback_f &f,
const py::list &work) {
223 auto start_f = [f](
int j) {
224 auto invoke_f = [f, j] {
225 std::this_thread::sleep_for(std::chrono::milliseconds(50));
228 auto t = std::thread(std::move(invoke_f));
233 for (
auto i : work) {
234 start_f(py::cast<int>(i));
238 m.def(
"callback_num_times", [](
const py::function &f, std::size_t num) {
239 for (std::size_t i = 0; i < num; i++) {
244 auto *custom_def = []() {
245 static PyMethodDef def;
246 def.ml_name =
"example_name";
247 def.ml_doc =
"Example doc";
248 def.ml_meth = [](PyObject *, PyObject *
args) -> PyObject * {
249 if (PyTuple_Size(
args) != 1) {
250 throw std::runtime_error(
"Invalid number of arguments for example_name");
252 PyObject *
first = PyTuple_GetItem(
args, 0);
253 if (!PyLong_Check(
first)) {
254 throw std::runtime_error(
"Invalid argument to example_name");
256 auto result = py::cast(PyLong_AsLong(
first) * 9);
257 return result.release().ptr();
259 def.ml_flags = METH_VARARGS;
266 constexpr const char *rec_capsule_name
267 = pybind11::detail::internals_function_record_capsule_name;
268 py::capsule rec_capsule(std::malloc(1), [](
void *
data) { std::free(
data); });
269 rec_capsule.set_name(rec_capsule_name);
270 m.add_object(
"custom_function", PyCFunction_New(custom_def, rec_capsule.ptr()));
273#if PYBIND11_INTERNALS_VERSION > 4
275 py::capsule rec_capsule2(std::malloc(1), [](
void *
data) { std::free(
data); });
276 m.add_object(
"custom_function2", PyCFunction_New(custom_def, rec_capsule2.ptr()));
278 m.add_object(
"custom_function2", py::none());
constexpr int first(int i)
Implementation details for constexpr functions.
void print_default_created(T *inst, Values &&...values)
void track_destroyed(T *inst)
void print_copy_created(T *inst, Values &&...values)
void track_move_created(T *inst)
void track_copy_created(T *inst)
void print_destroyed(T *inst, Values &&...values)
void track_default_created(T *inst, Values &&...values)
void print_move_created(T *inst, Values &&...values)
#define TEST_SUBMODULE(name, variable)
arr data(const arr &a, Ix... index)
int dummy_function(int i)
Dummy type which is not exported anywhere – something to trigger a conversion error.