Python decorator handling docstrings
I have a problem using docstrings with decorators. Given the following example:
def decorator(f):
def _decorator():
print 'decorator active'
f()
return _decorator
@decorator
def foo():
'''the magic foo function'''
print 'this is function foo'
help(foo)
Now the help doesn't show me the docstring of foo
as expected, it shows:
Help on function _decorator in module __main__:
_decorator()
Without the decorator, the help is correct:
Help on function foo in module __main__:
foo()
the magic foo function
I know, that the function foo
is wrapped by the decorator, and so the function object is not the function foo
any more. But what is a nice solution to get the docstring (and the help) as expected?
Asked by: First Name672 | Posted: 30-11-2021
Answer 1
Use functools.wraps()
to update the attributes of the decorator:
from functools import wraps
def decorator(f):
@wraps(f)
def _decorator():
print 'decorator active'
f()
return _decorator
@decorator
def foo():
'''the magic foo function'''
print 'this is function foo'
help(foo)
Also see the Standard Library documentation for functools
.
Answer 2
I found a solution, but don't know if it's really nice:
def decorator(f):
def _decorator():
print 'decorator active'
f()
_decorator.__name__=f.__name__
_decorator.__doc__=f.__doc__
return _decorator
The part with _decorator.__name__=f.__name__
seems a little bit hideous... What do you think?
Answer 3
Take a look at functools.wraps
: http://docs.python.org/library/functools.html
Answer 4
The solution is pretty easy. The doc string should be mentioned in the top most decorator that is being called on top of the main function. Find the example below:
import math
def wrap2(func):
def squarer(x):
return [math.sqrt(i) for i in func(x)]
return squarer
def wrap1(func):
def summer(x):
return [i*2 for i in func(x)]
return summer
def wrap3(func):
def rounder(x):
return [round(i,1) for i in func(x)]
return rounder
def wrap4(func):
def stringer(x):
'''
Enter the input of a 2-dim array to get the output
'''
return [str(i)+' rounds ' for i in func(x)]
return stringer
@wrap4
@wrap3
@wrap2
@wrap1
def rooter(i):
return [sum(p) for p in i]
help(rooter)
# output
Help on function stringer in module __main__:
stringer(x)
Enter the input of a 2-dim array to get the output
---or----
Signature: rooter(x)
Docstring: Enter the input of a 2-dim array to get the output
File: d:\<ipython-input-392-487fc73b05cf>
Type: function
So, the Doc String must be mentioned in the wrap4 decorator function for it to be visible in the main function.
Answered by: Blake617 | Posted: 01-01-2022Similar questions
decorator - Python cmd dynamic docstrings for do_help() function
I'm working on a Pythonic command-line "flashcard" app for helping users learn different languages. I would like to use Python's cmd library to speed up development--of particular interest is the cmd.Cmd class's do_help() method, which prints off the doc strings for the classes's user methods. However, due to the multilingual nature of this application, I'd like to be able to drop in language-specific docstrings.
I...
python - Docstrings for data?
Is there a way to describe the module's data in a similar way that a docstring describes a module or a funcion?
class MyClass(object):
def my_function():
"""This docstring works!"""
return True
my_list = []
"""This docstring does not work!"""
syntax error - python docstrings
ok so I decided to learn python (perl, c, c++, java, objective-c, ruby and a bit of erlang and scala under my belt). and I keep on getting the following error when I try executing this:
Tue Jul 21{stevenhirsch@steven-hirschs-macbook-pro-2}/projects/python:-->./apache_logs.py
File "./apache_logs.py", line 17
print __doc__
^
SyntaxError: invalid syntax
#!/usr/local/bin/python
"""...
Are Python docstrings and comments stored in memory when a module is loaded?
Are Python docstrings and comments stored in memory when a module is loaded?
I've wondered if this is true, because I usually document my code well; may this affect memory usage?
Usually every Python object has a __doc__ method. Are those docstrings read from the file, or processed otherwise?
I've done searches here in the forums, Google and...
How to fold long docstrings in python source code in VIM?
Does anybody know of a method, or perhaps a plugin, that will
automatically fold long docstrings in Python? I have docstrings in my
code that span several pages, so it is troublesome to keep paging
through them. The other tricky part is that there is embedded python
testing code in the docstrings, so that might make parsing them
difficult. Note that I only need to automatically fold the entire
docstr...
python - Using shorter textwidth in comments and docstrings
From the mighty PEP 8:
[P]lease limit all lines to a maximum of 79 characters. For flowing long blocks of text (docstrings or comments), limiting the length to 72 characters is recommended.
When editing Python code in Vim, I set my textwidth to 79, and Vim au...
python - Writing docstrings - specifying functions arguments and returns
Suppose I have a function, say:
>>> def foo(a):
return a+1
I want to write a documentation string for it.
what is the convention in specifying in the docstring that it takes a and returns a+1?
python - Is there a way to keep docstrings separate from the functions they document?
I'm working on a module with many small functions but whose docstrings tend to be quite long. The docstrings make working on the module irritating as I have to constantly scroll over a long docstring to find a little bit of actual code.
Is there a way to keep docstrings separate from the functions they document? I'd really like to be able to specify the docstrings at the end of the file away from the code or, even...
How do I change Emacs's font face for Python docstrings?
I'm just starting to learn Python and use Emacs as my editor. Currently, Emacs uses the same color for normal strings (single quotes) and docstrings (triple quotes). I want docstrings to be a different color, so I used the 'Options->Customize Emacs' menu option to change 'font-lock-doc-face' to a new color and saved the changes. However, Emacs continues to keep docstrings the same color as normal strings. Changing the ...
python - Put docstrings on special methods?
I'm trying to decide what information to put in the class docstring and what to put in the __init__ method docstring. Up until now I've been putting an overview of the class and how to work with it in the class docstring, while stuff directly related to initialization (argument details etc.) I put in the __init__ docstring.
Today I started wondering if this was the right way of doing it, s...
static analysis - How to calculate lines of code, comments and docstrings for a Python module?
Is there a tool or snippet that produces the following output in some form:
lines_of_code = 98
lines_of_comments = 24
lines_of_documentation = 11
NOTE 1: I will then try to feed this data to Jenkins to graph.
NOTE 2: I am aware that CLOC co...
Still can't find your answer? Check out these communities...
PySlackers | Full Stack Python | NHS Python | Pythonist Cafe | Hacker Earth | Discord Python