param.default = default
if type or default: out.has_complex_params = True
- # *args / **kwargs are shown in the signature only for
- # overloaded functions and we are expanding those
- assert name not in ['*args', '**kwargs']
-
- param.kind = 'POSITIONAL_ONLY' if positional_only else 'POSITIONAL_OR_KEYWORD'
+ # *args / **kwargs can still appear in the parsed signatures if
+ # the function accepts py::args / py::kwargs directly
+ if name == '*args':
+ param.name = 'args'
+ param.kind = 'VAR_POSITIONAL'
+ elif name == '**kwargs':
+ param.name = 'kwargs'
+ param.kind = 'VAR_KEYWORD'
+ else:
+ param.kind = 'POSITIONAL_ONLY' if positional_only else 'POSITIONAL_OR_KEYWORD'
out.params += [param]
private: float _foo = 0.0f;
};
+void duck(py::args, py::kwargs) {}
+
PYBIND11_MODULE(pybind_signatures, m) {
m.doc() = "pybind11 function signature extraction";
.def("taking_a_list_returning_a_tuple", &takingAListReturningATuple, "Takes a list, returns a tuple")
.def("crazy_signature", &crazySignature, "Function that failed to get parsed")
.def("overloaded", static_cast<std::string(*)(int)>(&overloaded), "Overloaded for ints")
- .def("overloaded", static_cast<bool(*)(float)>(&overloaded), "Overloaded for floats");
+ .def("overloaded", static_cast<bool(*)(float)>(&overloaded), "Overloaded for floats")
+ .def("duck", &duck, "A function taking args/kwargs directly");
py::class_<MyClass>(m, "MyClass", "My fun class!")
.def_static("static_function", &MyClass::staticFunction, "Static method with positional-only args")
<span class="m-doc-wrap-bumper">def <a href="" class="m-doc-self">crazy_signature</a>(</span><span class="m-doc-wrap">…)</span>
</dt>
<dd>Function that failed to get parsed</dd>
+ <dt>
+ <span class="m-doc-wrap-bumper">def <a href="" class="m-doc-self">duck</a>(</span><span class="m-doc-wrap">*args, **kwargs)</span>
+ </dt>
+ <dd>A function taking args/kwargs directly</dd>
<dt>
<span class="m-doc-wrap-bumper">def <a href="" class="m-doc-self">overloaded</a>(</span><span class="m-doc-wrap">arg0: int<span class="m-text m-dim">, /</span>) -> str</span>
</dt>