diff --git a/pybindgen/cppclass.py b/pybindgen/cppclass.py index 10bfc46..1971151 100644 --- a/pybindgen/cppclass.py +++ b/pybindgen/cppclass.py @@ -2205,6 +2205,10 @@ typedef struct { if self.binary_numeric_operators: tp_flags.add("Py_TPFLAGS_CHECKTYPES") self.slots.setdefault("tp_flags", '|'.join(tp_flags)) + + if docstring is None: + docstring = self.generate_docstring() + self.slots.setdefault("tp_doc", (docstring is None and 'NULL' or "\"%s\"" % (docstring,))) dict_ = self.slots @@ -2227,6 +2231,10 @@ typedef struct { self.pytype.generate(code_sink) + def generate_docstring(self): + name = self.get_python_name() + return "\\n".join(sorted([c.generate_docstring(name) for c in self.constructors], + key=len, reverse=True)) def _generate_constructor(self, code_sink): """generate the constructor, if any""" diff --git a/pybindgen/cppmethod.py b/pybindgen/cppmethod.py index c5b31bd..9d29e2f 100644 --- a/pybindgen/cppmethod.py +++ b/pybindgen/cppmethod.py @@ -406,12 +406,23 @@ class CppMethod(ForwardWrapperBase): def get_py_method_def(self, method_name): "Get the PyMethodDef entry suitable for this method" flags = self.get_py_method_def_flags() + + if self.docstring is None: + self.docstring = self.generate_docstring(method_name) + return "{(char *) \"%s\", (PyCFunction) %s, %s, %s }," % \ (method_name, self.wrapper_actual_name, '|'.join(flags), (self.docstring is None and "NULL" or ('"'+self.docstring+'"'))) + def generate_docstring(self, name): + parameters = self.parameters + signature = "{0}({1})".format(name, ", ".join([p.name for p in parameters])) + params = "\\n".join(["type: {0}: {1}".format(p.name, p.ctype) + for p in parameters]) + string = signature + "\\n\\n" + params + return string + def __str__(self): - if self.class_ is None: cls_name = "???" else: @@ -736,6 +747,9 @@ class CppConstructor(ForwardWrapperBase): code_sink.writeln('return 0;') self.write_close_wrapper(code_sink) + def generate_docstring(self, name): + return "{0}({1})".format(name, ', '.join([p.name for p in self.parameters])) + def __str__(self): if not hasattr(self, '_class'): return object.__str__(self) diff --git a/pybindgen/function.py b/pybindgen/function.py index 77d7940..19b0883 100644 --- a/pybindgen/function.py +++ b/pybindgen/function.py @@ -289,10 +289,22 @@ class Function(ForwardWrapperBase): assert isinstance(self.wrapper_return, string_types) assert isinstance(self.wrapper_actual_name, string_types) assert isinstance(self.wrapper_args, list) + + if self.docstring is None: + self.docstring = self.generate_docstring(name) + return "{(char *) \"%s\", (PyCFunction) %s, %s, %s }," % \ (name, self.wrapper_actual_name, '|'.join(flags), (self.docstring is None and "NULL" or ('"'+self.docstring+'"'))) + def generate_docstring(self, name): + parameters = self.parameters + signature = "{0}({1})".format(name, ", ".join([p.name for p in parameters])) + params = "\\n".join(["type: {0}: {1}".format(p.name, p.ctype) + for p in parameters]) + string = signature + "\\n\\n" + params + return string + class CustomFunctionWrapper(Function): """