Here is what I am doing:
class Foo:
def __init__(self, **kwargs):
"""
docstring of Foo.
"""
self.sum = bar(**kwargs)
__init__.__doc__ += bar.__doc__
def bar(a, b):
"""
docstring of bar.
a: int
b: int
"""
print(a+b)
What I wanted to do:
There are some calculations defined in bar
. The class Foo
uses bar
. I would like to avoid duplicate code, i.e. I would like to avoid writing for example a: int
in Foo
. Thus I am trying to "port" (is this the right term?) the docstring of bar
into Foo
by adding that line __init__.__doc__ += bar.__doc__
.
Is this the right way to do this? Am I hacking? Imagine Foo
is part of API, whereas bar
is the backstage subroutine. What's the correct way of displaying the docstring of bar
to the user?
You need to define bar
before Foo
. In your current configuration, the name bar
does not exist in the global namespace when the class body is executed.
You might consider adding a newline or some sort of divider between the docs:
__init__.__doc__ += '\n' + bar.__doc__
Documentation is rarely read directly from a docstring. A better answer would be to use a tool like sphinx to generate useable documentation in a format like HTML or PDF. Instead of copy-and-pasting the documentation of bar
into that of Foo.__init__
, you could link to it. This would have the advantage that you would not need to rearrange the objects in the global namespace.
The popular plotting library matplotlib is a great example of your exact usecase. It has many functions, like matplotlib.pyplot.subplots
, which passes through is remaining arguments (fig_kw
) to matplotlib.pyplot.figure
. Looking at the source for the docstring, we see:
**fig_kw All additional keyword arguments are passed to the `.pyplot.figure` call.
The backticks generate a link in sphinx. You can write the docstring of Foo.__init__
in a similar manner:
"""
docstring of Foo.
Parameters
----------
**kwargs
Arguments passed through to `bar`.
"""