Python > Quality and Best Practices > Documentation > Writing Effective Docstrings
Comprehensive Docstring Example: Function with Arguments and Return
This example demonstrates a well-documented Python function that takes arguments, performs an operation, and returns a value. It showcases best practices for docstring formatting, including parameter descriptions, return value explanations, and potential exceptions.
Code Snippet
This function, `calculate_area`, computes the area of a rectangle. The docstring follows the common convention of describing arguments, return values, and exceptions. It also includes doctests, which are executable examples embedded within the docstring.
def calculate_area(length, width):
"""Calculates the area of a rectangle.
Args:
length (float): The length of the rectangle.
width (float): The width of the rectangle.
Returns:
float: The area of the rectangle.
Raises:
TypeError: If either length or width is not a number.
ValueError: If either length or width is negative.
Examples:
>>> calculate_area(5, 4)
20.0
>>> calculate_area(10.5, 2.0)
21.0
"""
if not isinstance(length, (int, float)) or not isinstance(width, (int, float)):
raise TypeError("Length and width must be numbers.")
if length < 0 or width < 0:
raise ValueError("Length and width cannot be negative.")
return float(length * width)
Concepts Behind the Snippet
The key concept is to provide sufficient information in the docstring so that someone can understand how to use the function without needing to read the code. This includes explaining the purpose of the function, describing each parameter, specifying the return type and value, and documenting any potential exceptions. Doctests are also crucial for demonstrating how to use the function and verifying its correctness.
Real-Life Use Case
Imagine you are building a library of mathematical functions. Other developers will use your functions, and they need to understand how to call them correctly. Well-written docstrings ensure that your library is easy to use and maintain. For instance, if another developer needs to use `calculate_area` within their application to compute the size of various rectangular regions, they can do so confidently by referring to the documentation embedded within the function's docstring.
Best Practices
Interview Tip
When asked about documentation in a Python interview, emphasize the importance of docstrings for code maintainability, collaboration, and API usability. Mention the different docstring conventions and the benefits of using doctests for automated testing. Be prepared to explain how to write effective docstrings for functions, classes, and modules.
When to Use Docstrings
Docstrings should be used for all functions, classes, and modules. Even simple functions benefit from documentation, as it clarifies their purpose and usage. Docstrings are especially important for public APIs, as they serve as the primary source of information for users of the API.
Alternatives to Docstrings
While docstrings are the primary means of documenting Python code, other options exist. External documentation tools like Sphinx can generate comprehensive documentation websites from docstrings and other sources. Type hints can also supplement docstrings by providing information about the expected types of function parameters and return values. However, docstrings remain essential for in-code documentation and are used by many tools and IDEs.
Pros of Docstrings
Cons of Docstrings
FAQ
-
What is a docstring?
A docstring is a string literal that occurs as the first statement in a module, function, class, or method definition. It's used to document the object. -
How do I access a docstring?
You can access the docstring of an object using the `__doc__` attribute (e.g., `calculate_area.__doc__`) or the `help()` function (e.g., `help(calculate_area)`). -
What is a doctest?
A doctest is an executable example embedded within a docstring. It allows you to test your code directly from the documentation.