Wenzel Jakob | a576e6a | 2015-07-29 17:51:54 +0200 | [diff] [blame] | 1 | /* |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 2 | tests/test_kwargs_and_defaults.cpp -- keyword arguments and default values |
Wenzel Jakob | a576e6a | 2015-07-29 17:51:54 +0200 | [diff] [blame] | 3 | |
Wenzel Jakob | 8cb6cb3 | 2016-04-17 20:21:41 +0200 | [diff] [blame] | 4 | Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch> |
Wenzel Jakob | a576e6a | 2015-07-29 17:51:54 +0200 | [diff] [blame] | 5 | |
| 6 | All rights reserved. Use of this source code is governed by a |
| 7 | BSD-style license that can be found in the LICENSE file. |
| 8 | */ |
| 9 | |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 10 | #include "pybind11_tests.h" |
Wenzel Jakob | 9180519 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 11 | #include <pybind11/stl.h> |
Wenzel Jakob | a576e6a | 2015-07-29 17:51:54 +0200 | [diff] [blame] | 12 | |
Dean Moldovan | 665e880 | 2016-08-12 22:28:31 +0200 | [diff] [blame] | 13 | std::string kw_func(int x, int y) { return "x=" + std::to_string(x) + ", y=" + std::to_string(y); } |
Wenzel Jakob | a576e6a | 2015-07-29 17:51:54 +0200 | [diff] [blame] | 14 | |
Dean Moldovan | 665e880 | 2016-08-12 22:28:31 +0200 | [diff] [blame] | 15 | std::string kw_func4(const std::vector<int> &entries) { |
| 16 | std::string ret = "{"; |
Wenzel Jakob | 9180519 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 17 | for (int i : entries) |
Dean Moldovan | 665e880 | 2016-08-12 22:28:31 +0200 | [diff] [blame] | 18 | ret += std::to_string(i) + " "; |
| 19 | ret.back() = '}'; |
| 20 | return ret; |
Wenzel Jakob | 9180519 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 21 | } |
| 22 | |
Dean Moldovan | 99dbdc1 | 2016-08-19 13:45:36 +0200 | [diff] [blame] | 23 | py::tuple args_function(py::args args) { |
| 24 | return args; |
Wenzel Jakob | 178c8a8 | 2016-05-10 15:59:01 +0100 | [diff] [blame] | 25 | } |
| 26 | |
Dean Moldovan | 99dbdc1 | 2016-08-19 13:45:36 +0200 | [diff] [blame] | 27 | py::tuple args_kwargs_function(py::args args, py::kwargs kwargs) { |
| 28 | return py::make_tuple(args, kwargs); |
Wenzel Jakob | 6c03beb | 2016-05-08 14:34:09 +0200 | [diff] [blame] | 29 | } |
| 30 | |
Jason Rhinelander | 2686da8 | 2017-01-21 23:42:14 -0500 | [diff] [blame] | 31 | py::tuple mixed_plus_args(int i, double j, py::args args) { |
| 32 | return py::make_tuple(i, j, args); |
| 33 | } |
| 34 | |
| 35 | py::tuple mixed_plus_kwargs(int i, double j, py::kwargs kwargs) { |
| 36 | return py::make_tuple(i, j, kwargs); |
| 37 | } |
| 38 | |
| 39 | py::tuple mixed_plus_args_kwargs(int i, double j, py::args args, py::kwargs kwargs) { |
| 40 | return py::make_tuple(i, j, args, kwargs); |
| 41 | } |
| 42 | |
| 43 | // pybind11 won't allow these to be bound: args and kwargs, if present, must be at the end. |
| 44 | void bad_args1(py::args, int) {} |
| 45 | void bad_args2(py::kwargs, int) {} |
| 46 | void bad_args3(py::kwargs, py::args) {} |
| 47 | void bad_args4(py::args, int, py::kwargs) {} |
| 48 | void bad_args5(py::args, py::kwargs, int) {} |
| 49 | void bad_args6(py::args, py::args) {} |
| 50 | void bad_args7(py::kwargs, py::kwargs) {} |
| 51 | |
Dean Moldovan | ecced6c | 2016-07-31 20:03:18 +0200 | [diff] [blame] | 52 | struct KWClass { |
| 53 | void foo(int, float) {} |
| 54 | }; |
| 55 | |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 56 | test_initializer arg_keywords_and_defaults([](py::module &m) { |
Dean Moldovan | ecced6c | 2016-07-31 20:03:18 +0200 | [diff] [blame] | 57 | m.def("kw_func0", &kw_func); |
| 58 | m.def("kw_func1", &kw_func, py::arg("x"), py::arg("y")); |
Wenzel Jakob | a576e6a | 2015-07-29 17:51:54 +0200 | [diff] [blame] | 59 | m.def("kw_func2", &kw_func, py::arg("x") = 100, py::arg("y") = 200); |
Wenzel Jakob | 66c9a40 | 2016-01-17 22:36:36 +0100 | [diff] [blame] | 60 | m.def("kw_func3", [](const char *) { }, py::arg("data") = std::string("Hello world!")); |
Wenzel Jakob | 9180519 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 61 | |
| 62 | /* A fancier default argument */ |
| 63 | std::vector<int> list; |
| 64 | list.push_back(13); |
| 65 | list.push_back(17); |
Wenzel Jakob | 9180519 | 2016-01-17 22:36:43 +0100 | [diff] [blame] | 66 | m.def("kw_func4", &kw_func4, py::arg("myList") = list); |
Wenzel Jakob | 178c8a8 | 2016-05-10 15:59:01 +0100 | [diff] [blame] | 67 | |
| 68 | m.def("args_function", &args_function); |
| 69 | m.def("args_kwargs_function", &args_kwargs_function); |
Dean Moldovan | 96017dd | 2016-06-03 10:00:40 +0200 | [diff] [blame] | 70 | |
Dean Moldovan | 96017dd | 2016-06-03 10:00:40 +0200 | [diff] [blame] | 71 | m.def("kw_func_udl", &kw_func, "x"_a, "y"_a=300); |
Jerry Gamache | c6e0cdf | 2016-06-15 12:48:15 -0400 | [diff] [blame] | 72 | m.def("kw_func_udl_z", &kw_func, "x"_a, "y"_a=0); |
Wenzel Jakob | fe34241 | 2016-09-06 13:02:29 +0900 | [diff] [blame] | 73 | |
Dean Moldovan | ecced6c | 2016-07-31 20:03:18 +0200 | [diff] [blame] | 74 | py::class_<KWClass>(m, "KWClass") |
| 75 | .def("foo0", &KWClass::foo) |
| 76 | .def("foo1", &KWClass::foo, "x"_a, "y"_a); |
Jason Rhinelander | 2686da8 | 2017-01-21 23:42:14 -0500 | [diff] [blame] | 77 | |
| 78 | m.def("mixed_plus_args", &mixed_plus_args); |
| 79 | m.def("mixed_plus_kwargs", &mixed_plus_kwargs); |
| 80 | m.def("mixed_plus_args_kwargs", &mixed_plus_args_kwargs); |
| 81 | |
| 82 | m.def("mixed_plus_args_kwargs_defaults", &mixed_plus_args_kwargs, |
| 83 | py::arg("i") = 1, py::arg("j") = 3.14159); |
| 84 | |
| 85 | // Uncomment these to test that the static_assert is indeed working: |
| 86 | // m.def("bad_args1", &bad_args1); |
| 87 | // m.def("bad_args2", &bad_args2); |
| 88 | // m.def("bad_args3", &bad_args3); |
| 89 | // m.def("bad_args4", &bad_args4); |
| 90 | // m.def("bad_args5", &bad_args5); |
| 91 | // m.def("bad_args6", &bad_args6); |
| 92 | // m.def("bad_args7", &bad_args7); |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 93 | }); |