Add _a literal for named arguments

This commit is contained in:
Dean Moldovan 2016-06-03 10:00:40 +02:00
parent f600c1d899
commit 96017dd7cd
4 changed files with 27 additions and 8 deletions

View File

@ -55,4 +55,7 @@ void init_ex11(py::module &m) {
m.def("args_function", &args_function); m.def("args_function", &args_function);
m.def("args_kwargs_function", &args_kwargs_function); m.def("args_kwargs_function", &args_kwargs_function);
using namespace py::literals;
m.def("kw_func_udl", &kw_func, "x"_a, "y"_a=300);
} }

View File

@ -6,12 +6,13 @@ import pydoc
sys.path.append('.') sys.path.append('.')
from example import kw_func, kw_func2, kw_func3, kw_func4, call_kw_func from example import kw_func, kw_func2, kw_func3, kw_func4, call_kw_func
from example import args_function, args_kwargs_function from example import args_function, args_kwargs_function, kw_func_udl
print(pydoc.render_doc(kw_func, "Help on %s")) print(pydoc.render_doc(kw_func, "Help on %s"))
print(pydoc.render_doc(kw_func2, "Help on %s")) print(pydoc.render_doc(kw_func2, "Help on %s"))
print(pydoc.render_doc(kw_func3, "Help on %s")) print(pydoc.render_doc(kw_func3, "Help on %s"))
print(pydoc.render_doc(kw_func4, "Help on %s")) print(pydoc.render_doc(kw_func4, "Help on %s"))
print(pydoc.render_doc(kw_func_udl, "Help on %s"))
kw_func(5, 10) kw_func(5, 10)
kw_func(5, y=10) kw_func(5, y=10)
@ -39,3 +40,5 @@ call_kw_func(kw_func2)
args_function('arg1_value', 'arg2_value', 3) args_function('arg1_value', 'arg2_value', 3)
args_kwargs_function('arg1_value', 'arg2_value', arg3='arg3_value', arg4=4) args_kwargs_function('arg1_value', 'arg2_value', arg3='arg3_value', arg4=4)
kw_func_udl(x=5, y=10)

View File

@ -18,6 +18,11 @@ Help on built-in function kw_func4 in module example
kkww__ffuunncc44(...) kkww__ffuunncc44(...)
kw_func4(myList : list<int> = [13L, 17L]) -> NoneType kw_func4(myList : list<int> = [13L, 17L]) -> NoneType
Help on built-in function kw_func_udl in module example
kkww__ffuunncc__uuddll(...)
kw_func_udl(x : int, y : int = 300L) -> NoneType
kw_func(x=5, y=10) kw_func(x=5, y=10)
kw_func(x=5, y=10) kw_func(x=5, y=10)
kw_func(x=5, y=10) kw_func(x=5, y=10)
@ -40,3 +45,5 @@ got argument: arg1_value
got argument: arg2_value got argument: arg2_value
got keyword argument: arg3 -> arg3_value got keyword argument: arg3 -> arg3_value
got keyword argument: arg4 -> 4 got keyword argument: arg4 -> 4
kw_func(x=5, y=10)

View File

@ -18,23 +18,29 @@ template <typename T> struct arg_t;
/// Annotation for keyword arguments /// Annotation for keyword arguments
struct arg { struct arg {
arg(const char *name) : name(name) { } constexpr arg(const char *name) : name(name) { }
template <typename T> arg_t<T> operator=(const T &value);
template <typename T, size_t N> arg_t<const T *> operator=(T const (&value)[N]); template <typename T>
constexpr arg_t<T> operator=(const T &value) const { return {name, value}; }
template <typename T, size_t N>
constexpr arg_t<const T *> operator=(T const (&value)[N]) const {
return operator=((const T *) value);
};
const char *name; const char *name;
}; };
/// Annotation for keyword arguments with default values /// Annotation for keyword arguments with default values
template <typename T> struct arg_t : public arg { template <typename T> struct arg_t : public arg {
arg_t(const char *name, const T &value, const char *descr = nullptr) constexpr arg_t(const char *name, const T &value, const char *descr = nullptr)
: arg(name), value(value), descr(descr) { } : arg(name), value(value), descr(descr) { }
T value; T value;
const char *descr; const char *descr;
}; };
template <typename T> arg_t<T> arg::operator=(const T &value) { return arg_t<T>(name, value); } inline namespace literals {
template <typename T, size_t N> arg_t<const T *> arg::operator=(T const (&value)[N]) { /// String literal version of arg
return operator=((const T *) value); constexpr arg operator"" _a(const char *name, size_t) { return {name}; }
} }
/// Annotation for methods /// Annotation for methods