Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should you always document functions, even if redundant (specifically python)?

I try to use function names that are active and descriptive, which I then document with active and descriptive text (!). This generates redundant-looking code.

Simplified (but not so unrealistic) example in python, following numpy docstring style:

def calculate_inverse(matrix):
    """Calculate the inverse of a matrix.

    Parameters
    ----------
    matrix : ndarray
        The matrix to be inverted.

    Returns
    -------
    matrix_inv : ndarray
        The inverse of the matrix.

    """
    matrix_inv = scipy.linalg.inv(matrix)
    return matrix_inv

Specifically for python, I have read PEP-257 and the sphinx/napoleon example numpy and Google style docstrings. I like that I can automatically generate documentation for my functions, but what is the "best practice" for redundant examples like above? Should one simply not document "obvious" classes, functions, etc? The degree of "obviousness" then of course becomes subjective ...

I have in mind open-source, distributed code. Multiple authors suggests that the code itself should be readable (calculate_inverse(A) better than dgetri(A)), but multiple end-users would benefit from sphinx-style documentation.

like image 518
barford Avatar asked Oct 08 '15 15:10

barford


2 Answers

I've always followed the guideline that the code tells you what it does, the comments are added to explain why it does something.

If you can't read the code, you have no business looking at it, so having (in the extreme):

index += 1   # move to next item

is a total waste of time. So is a comment on a function called calculate_inverse(matrix) which states that it calculates the inverse of the matrix.

Whereas something like:

# Use Pythagoras theorem to find hypotenuse length.
hypo = sqrt (side1 * side1 + side2 * side2)

might be more suitable since it adds the information on where the equation came from, in case you need to investigate it further.

Comments should really be reserved for added information, such as the algorithm you use for calculating the inverse. In this case, since your algorithm is simply handing off the work to scipy, it's totally unnecessary.

If you must have a docstring here for auto-generated documentation, I certainly wouldn't be going beyond the one-liner variant for this very simple case:

"""Return the inverse of a matrix"""
like image 173
paxdiablo Avatar answered Nov 13 '22 06:11

paxdiablo


"Always"? Definitively not. Comment as little as possible. Comments lie. They always lie, and if they don't, then they will be lying tomorrow. The same applies to many docs.

The only times (imo) that you should be writing comments/documentation for your code is when you are shipping a library to clients/customers or if you're in an open source project. In these cases you should also have a rigorous standard so there is never any ambiguity what should and should not be documented, and how.

In these cases you also need to have an established workflow regarding who is responsible for updating the docs, since they will get out of sync with the code all the time.

So in summary, never ever comment/document if you can help it. If you have to (because of shipping libs/doing open source), do it Properly(tm).

like image 4
sara Avatar answered Nov 13 '22 08:11

sara