chiark / gitweb /
documentation/python: functions actually *can* take args/kwargs directly.
authorVladimír Vondruš <mosra@centrum.cz>
Sat, 4 May 2019 19:22:59 +0000 (21:22 +0200)
committerVladimír Vondruš <mosra@centrum.cz>
Sat, 4 May 2019 19:26:49 +0000 (21:26 +0200)
documentation/python.py
documentation/test_python/pybind_signatures/pybind_signatures.cpp
documentation/test_python/pybind_signatures/pybind_signatures.html

index 772158be83fb7e13ce7b9f018462d31bdfda0609..6b749314957cf809df707df1d27d5fdd2ef9ea7f 100755 (executable)
@@ -465,11 +465,16 @@ def extract_function_doc(state: State, parent, path: List[str], function) -> Lis
                 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]
 
index 4cb39638aa59268c74349cdf29efdbe6592fb121..ea145b272f4713ea3a15f306c9899101728e364e 100644 (file)
@@ -33,6 +33,8 @@ struct MyClass {
     private: float _foo = 0.0f;
 };
 
+void duck(py::args, py::kwargs) {}
+
 PYBIND11_MODULE(pybind_signatures, m) {
     m.doc() = "pybind11 function signature extraction";
 
@@ -43,7 +45,8 @@ PYBIND11_MODULE(pybind_signatures, m) {
         .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")
index 82ed966db1fa40f00cf7a01358ef1b670c42fc47..b314bfcf562ca794983d88c34ad233e9fd9ca6a3 100644 (file)
               <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>) -&gt; str</span>
             </dt>