1 from __future__
import annotations
4 from threading
import Thread
9 from pybind11_tests
import callbacks
as m
10 from pybind11_tests
import detailed_error_messages_enabled
14 from functools
import partial
19 def func2(a, b, c, d):
20 return "func2", a, b, c, d
25 assert m.test_callback1(func1) ==
"func1"
26 assert m.test_callback2(func2) == (
"func2",
"Hello",
"x",
True, 5)
27 assert m.test_callback1(partial(func2, 1, 2, 3, 4)) == (
"func2", 1, 2, 3, 4)
28 assert m.test_callback1(partial(func3,
"partial")) ==
"func3(partial)"
29 assert m.test_callback3(
lambda i: i + 1) ==
"func(43) = 44"
31 f = m.test_callback4()
33 f = m.test_callback5()
34 assert f(number=43) == 44
40 def double(self, val):
44 assert m.test_callback3(z.double) ==
"func(43) = 86"
46 z = m.CppBoundMethodTest()
47 assert m.test_callback3(z.triple) ==
"func(43) = 129"
51 def f(*args, **kwargs):
54 assert m.test_tuple_unpacking(f) == ((
"positional", 1, 2, 3, 4, 5, 6), {})
55 assert m.test_dict_unpacking(f) == (
57 {
"key":
"value",
"a": 1,
"b": 2},
59 assert m.test_keyword_args(f) == ((), {
"x": 10,
"y": 20})
60 assert m.test_unpacking_and_keywords1(f) == ((1, 2), {
"c": 3,
"d": 4})
61 assert m.test_unpacking_and_keywords2(f) == (
62 (
"positional", 1, 2, 3, 4, 5),
63 {
"key":
"value",
"a": 1,
"b": 2,
"c": 3,
"d": 4,
"e": 5},
66 with pytest.raises(TypeError)
as excinfo:
67 m.test_unpacking_error1(f)
68 assert "Got multiple values for keyword argument" in str(excinfo.value)
70 with pytest.raises(TypeError)
as excinfo:
71 m.test_unpacking_error2(f)
72 assert "Got multiple values for keyword argument" in str(excinfo.value)
74 with pytest.raises(RuntimeError)
as excinfo:
75 m.test_arg_conversion_error1(f)
76 assert str(excinfo.value) ==
"Unable to convert call argument " + (
77 "'1' of type 'UnregisteredType' to Python object"
78 if detailed_error_messages_enabled
79 else "'1' to Python object (#define PYBIND11_DETAILED_ERROR_MESSAGES or compile in debug mode for details)"
82 with pytest.raises(RuntimeError)
as excinfo:
83 m.test_arg_conversion_error2(f)
84 assert str(excinfo.value) ==
"Unable to convert call argument " + (
85 "'expected_name' of type 'UnregisteredType' to Python object"
86 if detailed_error_messages_enabled
87 else "'expected_name' to Python object "
88 "(#define PYBIND11_DETAILED_ERROR_MESSAGES or compile in debug mode for details)"
93 m.test_lambda_closure_cleanup()
94 cstats = m.payload_cstats()
95 assert cstats.alive() == 0
96 assert cstats.copy_constructions == 1
97 assert cstats.move_constructions >= 1
101 alive_counts = m.test_cpp_callable_cleanup()
102 assert alive_counts == [0, 1, 2, 1, 2, 1, 0]
106 """Test if passing a function pointer from C++ -> Python -> C++ yields the original pointer"""
109 m.test_dummy_function(m.dummy_function) ==
"matches dummy_function: eval(1) = 2"
112 m.test_dummy_function(m.roundtrip(m.dummy_function))
113 ==
"matches dummy_function: eval(1) = 2"
116 m.test_dummy_function(m.dummy_function_overloaded)
117 ==
"matches dummy_function: eval(1) = 2"
119 assert m.roundtrip(
None, expect_none=
True)
is None
121 m.test_dummy_function(
lambda x: x + 2)
122 ==
"can't convert to function pointer: eval(1) = 3"
125 with pytest.raises(TypeError)
as excinfo:
126 m.test_dummy_function(m.dummy_function2)
127 assert "incompatible function arguments" in str(excinfo.value)
129 with pytest.raises(TypeError)
as excinfo:
130 m.test_dummy_function(
lambda x, y: x + y)
132 s
in str(excinfo.value)
133 for s
in (
"missing 1 required positional argument",
"takes exactly 2 arguments")
138 assert doc(m.test_callback3) ==
"test_callback3(arg0: Callable[[int], int]) -> str"
139 assert doc(m.test_callback4) ==
"test_callback4() -> Callable[[int], int]"
143 assert m.callback_with_movable(
lambda _:
None)
is True
148 reason=
"PyPy segfaults on here. See discussion on #1413.",
151 """Test if python builtins like sum() can be used as callbacks"""
152 assert m.test_sum_builtin(sum, [1, 2, 3]) == 6
153 assert m.test_sum_builtin(sum, []) == 0
167 return lambda j: res.append(s.value + j)
171 m.test_async_callback(gen_f(), work)
173 from time
import sleep
176 assert sum(res) == sum(x + 3
for x
in work)
180 t = Thread(target=test_async_callbacks)
190 one_million = 1000000
194 for rep
in range(repeats):
196 m.callback_num_times(
lambda:
None, num_millions * one_million)
197 td = time.time() - t0
198 rate = num_millions / td
if td
else 0
203 f
"callback_num_times: {num_millions:d} million / {td:.3f} seconds = {rate:.3f} million / second"
206 print(
"Min Mean Max")
207 print(f
"{min(rates):6.3f} {sum(rates) / len(rates):6.3f} {max(rates):6.3f}")
211 assert m.custom_function(4) == 36
212 assert m.roundtrip(m.custom_function)(4) == 36
216 m.custom_function2
is None, reason=
"Current PYBIND11_INTERNALS_VERSION too low"
219 assert m.custom_function2(3) == 27
220 assert m.roundtrip(m.custom_function2)(3) == 27
225 m.test_tuple_unpacking.__doc__.strip()
226 ==
"test_tuple_unpacking(arg0: Callable) -> object"