Python Comments Guide: Single-Line & Multi-Line Examples

Learn how to write effective comments in Python code. Master single-line, multi-line, and inline commenting techniques for better code documentation.

Writing Comments in Python Code

Introduction

Comments are essential elements in Python programming that serve as documentation within your code. They are non-executable text that provides explanations, clarifications, and context for the code's functionality. Comments make code more readable, maintainable, and understandable for both the original developer and others who may work with the code later.

Python comments are ignored by the interpreter during execution, meaning they do not affect the program's performance or behavior. They exist solely for human readers to understand the code's purpose, logic, and implementation details.

Types of Comments in Python

Python supports several types of comments, each serving different purposes and use cases. Understanding when and how to use each type is crucial for effective code documentation.

Single-Line Comments

Single-line comments are the most basic form of comments in Python. They begin with the hash symbol (#) and extend to the end of the line. Everything after the # symbol on that line is treated as a comment.

`python

This is a single-line comment

print("Hello, World!") # This is an inline comment

You can use multiple single-line comments

to create multi-line explanations

like this example

`

Multi-Line Comments

Python does not have a dedicated multi-line comment syntax like some other programming languages. However, there are several ways to create multi-line comments:

#### Using Multiple Hash Symbols

`python

This is a multi-line comment

created using multiple hash symbols

Each line must start with a hash

to be treated as a comment

`

#### Using Triple Quotes

Triple quotes can be used for multi-line comments, though technically they create string literals that are not assigned to variables:

`python """ This is a multi-line comment using triple double quotes. It can span multiple lines without needing hash symbols. """

''' This is another multi-line comment using triple single quotes. Both formats work identically. ''' `

Docstrings

Docstrings are special types of comments that serve as documentation for modules, classes, functions, and methods. They are written using triple quotes and are placed immediately after the definition line.

`python def calculate_area(length, width): """ Calculate 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 """ return length * width

class Rectangle: """ A class representing a rectangle shape. This class provides methods to calculate area and perimeter of a rectangle. """ def __init__(self, length, width): """Initialize a rectangle with given dimensions.""" self.length = length self.width = width `

Comment Syntax and Rules

Understanding the proper syntax and rules for writing comments ensures they are correctly interpreted by Python and maintain code readability.

Basic Syntax Rules

| Rule | Description | Example | |------|-------------|---------| | Hash Symbol | Single-line comments start with # | # This is a comment | | Position | # can appear at the beginning or middle of a line | print("Hello") # Inline comment | | Whitespace | Space after # improves readability | # Good vs #Bad | | Case Sensitivity | Comments are case-sensitive | # TODO vs # todo | | Special Characters | Any character can follow # | # Comment with symbols: @#$% |

Triple Quote Rules

| Aspect | Single Quotes | Double Quotes | Mixed Usage | |--------|---------------|---------------|-------------| | Syntax | '''comment''' | """comment""" | Not recommended | | Functionality | Identical behavior | Identical behavior | Can cause confusion | | Convention | Less common for docstrings | Standard for docstrings | Avoid mixing | | Nesting | Can contain double quotes | Can contain single quotes | Choose based on content |

Best Practices for Writing Comments

Effective commenting requires following established best practices that enhance code readability and maintainability.

Clarity and Conciseness

Comments should be clear, concise, and directly related to the code they describe. Avoid overly verbose explanations or stating the obvious.

`python

Good: Explains the purpose

Calculate compound interest for investment planning

interest = principal (1 + rate) * time

Bad: States the obvious

Multiply principal by rate plus one raised to time power

interest = principal (1 + rate) * time

Good: Explains complex logic

Use binary search to find insertion point for maintaining sorted order

left, right = 0, len(sorted_list) while left < right: mid = (left + right) // 2 if sorted_list[mid] < item: left = mid + 1 else: right = mid `

Explaining Why, Not What

Focus comments on explaining why something is done rather than what is being done, as the code itself shows what is happening.

`python

Good: Explains reasoning

Retry failed requests up to 3 times to handle temporary network issues

max_retries = 3

Bad: Describes what the code does

Set max_retries variable to 3

max_retries = 3

Good: Explains business logic

Apply 10% discount for orders over $100 to encourage larger purchases

if order_total > 100: discount = order_total * 0.10 `

Updating Comments

Comments must be maintained alongside code changes to remain accurate and useful. Outdated comments can mislead developers and cause confusion.

`python

Original code and comment

Calculate tax at 8% rate

tax = subtotal * 0.08

Updated code with updated comment

Calculate tax at 10% rate (updated Jan 2024)

tax = subtotal * 0.10

Bad: Outdated comment

Calculate tax at 8% rate

tax = subtotal * 0.10 # Comment doesn't match implementation `

Comment Formatting and Style

Consistent formatting and style make comments more readable and professional. Following established conventions helps maintain code quality across projects and teams.

PEP 8 Guidelines

Python Enhancement Proposal 8 (PEP 8) provides official style guidelines for Python code, including comment formatting.

| Guideline | Requirement | Example | |-----------|-------------|---------| | Space after hash | Always include space after # | # Correct not #Incorrect | | Line length | Limit comments to 72 characters | Break long comments across lines | | Inline spacing | Two spaces before inline comments | code # comment | | Block comments | Start each line with # | Multiple lines with consistent format | | Capitalization | Start with capital letter | # This is properly capitalized |

Indentation and Alignment

Comments should follow the same indentation level as the code they describe, maintaining visual consistency and logical grouping.

`python def process_data(data): # Main processing function starts here if data: # Check if data is valid before processing for item in data: # Process each item individually if item.is_valid(): # Only process valid items result = item.process() # Store result for later use results.append(result) # Return processed results return results `

Special Comment Types and Conventions

Various special comment types serve specific purposes in Python development, helping with code organization, debugging, and project management.

TODO Comments

TODO comments mark areas where future work is needed, helping developers track incomplete or planned features.

`python

TODO: Implement error handling for network timeouts

def fetch_data(url): response = requests.get(url) return response.json()

TODO: Add input validation

TODO: Optimize for large datasets

def calculate_statistics(data): return sum(data) / len(data)

FIXME: This function crashes with empty lists

def find_maximum(numbers): return max(numbers)

HACK: Temporary workaround for API limitation

Remove this when API v2 is released

if api_version == "1.0": time.sleep(1) # Rate limiting workaround `

Documentation Tags

Various tags help categorize and organize comments for different purposes.

| Tag | Purpose | Example Usage | |-----|---------|---------------| | TODO | Future improvements needed | # TODO: Add error handling | | FIXME | Known bugs requiring fixes | # FIXME: Memory leak in loop | | HACK | Temporary or inelegant solutions | # HACK: Workaround for API bug | | NOTE | Important information | # NOTE: This affects performance | | WARNING | Potential issues or dangers | # WARNING: Thread-unsafe code | | BUG | Known issues | # BUG: Fails with Unicode input |

Code Section Headers

Large files benefit from section headers that organize related functions and classes.

`python #!/usr/bin/env python3 """ File: data_processor.py Description: Handles data processing and analysis tasks Author: Development Team Date: 2024 """

=============================================================================

IMPORTS AND DEPENDENCIES

=============================================================================

import os import sys import json from datetime import datetime

=============================================================================

CONFIGURATION AND CONSTANTS

=============================================================================

DEFAULT_TIMEOUT = 30 MAX_RETRIES = 3 API_BASE_URL = "https://api.example.com"

=============================================================================

UTILITY FUNCTIONS

=============================================================================

def format_timestamp(timestamp): """Convert timestamp to readable format.""" return datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S")

=============================================================================

MAIN PROCESSING CLASSES

=============================================================================

class DataProcessor: """Main class for data processing operations.""" pass `

Docstring Conventions and Formats

Docstrings serve as formal documentation for Python code elements and follow specific formatting conventions to ensure consistency and tool compatibility.

Google Style Docstrings

Google style docstrings provide a clean, readable format widely adopted in the Python community.

`python def calculate_compound_interest(principal, rate, time, compound_frequency=1): """Calculate compound interest for an investment. This function computes the final amount after compound interest is applied over a specified time period. Args: principal (float): The initial investment amount in dollars. rate (float): The annual interest rate as a decimal (e.g., 0.05 for 5%). time (int): The number of years for the investment. compound_frequency (int, optional): How many times interest is compounded per year. Defaults to 1. Returns: float: The final amount after compound interest is applied. Raises: ValueError: If principal, rate, or time are negative. TypeError: If inputs are not numeric types. Example: >>> calculate_compound_interest(1000, 0.05, 10, 12) 1643.62 Note: This function uses the standard compound interest formula: A = P(1 + r/n)^(nt) """ if principal < 0 or rate < 0 or time < 0: raise ValueError("Principal, rate, and time must be non-negative") return principal (1 + rate / compound_frequency) (compound_frequency time) `

NumPy Style Docstrings

NumPy style docstrings use a different format that some developers prefer for its explicit section headers.

`python def analyze_data_trends(data, window_size=30): """ Analyze trends in time series data using moving averages. Parameters ---------- data : list of float Time series data points to analyze. window_size : int, optional Size of the moving average window (default is 30). Returns ------- dict Dictionary containing trend analysis results with keys: - 'trend': str, overall trend direction ('up', 'down', 'stable') - 'slope': float, average rate of change - 'confidence': float, confidence level (0.0 to 1.0) Raises ------ ValueError If window_size is larger than data length. TypeError If data contains non-numeric values. Examples -------- >>> data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> analyze_data_trends(data, window_size=3) {'trend': 'up', 'slope': 1.0, 'confidence': 0.95} Notes ----- This function implements a simple linear regression on moving averages to determine trend direction and strength. """ pass `

Advanced Comment Techniques

Advanced commenting techniques help manage complex codebases and provide sophisticated documentation capabilities.

Conditional Comments

Comments can be used to explain conditional logic and decision-making processes in complex algorithms.

`python def optimize_route(locations, vehicle_capacity, time_constraints): """ Optimize delivery route using modified traveling salesman algorithm. """ # Phase 1: Initial route calculation # Use nearest neighbor heuristic as starting point since it provides # reasonable results quickly, even though not optimal current_route = nearest_neighbor_route(locations) # Phase 2: Route improvement # Apply 2-opt swaps to improve route efficiency # Continue until no improvement found or max iterations reached max_iterations = len(locations) * 10 iteration = 0 while iteration < max_iterations: # Try all possible 2-opt swaps improved = False for i in range(len(current_route)): for j in range(i + 2, len(current_route)): # Calculate distance change for this swap # Only apply if it reduces total distance new_route = two_opt_swap(current_route, i, j) if calculate_distance(new_route) < calculate_distance(current_route): current_route = new_route improved = True break if improved: break # Exit if no improvement found in this iteration if not improved: break iteration += 1 return current_route `

Version and Change Comments

Comments can track changes and versions within code files, providing historical context.

`python

Version History:

v1.0 - Initial implementation (2024-01-15)

v1.1 - Added error handling (2024-02-01)

v1.2 - Performance optimizations (2024-02-15)

v2.0 - Complete rewrite with new algorithm (2024-03-01)

def data_processing_engine(input_data): """ Main data processing engine. Changed in v2.0: Switched from recursive to iterative approach for better memory efficiency with large datasets. """ # New iterative implementation (v2.0) # Replaces previous recursive approach that caused stack overflow # with datasets larger than 1000 items result_stack = [] processing_queue = [input_data] while processing_queue: current_item = processing_queue.pop(0) # Process item using new algorithm processed = process_item(current_item) result_stack.append(processed) return result_stack `

Comment Tools and IDE Integration

Modern development environments provide tools and features that enhance comment writing and management.

IDE Comment Features

| Feature | Description | Common Shortcuts | |---------|-------------|------------------| | Toggle Comment | Add/remove comment markers | Ctrl+/ (Windows/Linux), Cmd+/ (Mac) | | Block Comment | Comment multiple lines | Ctrl+Shift+/ or Alt+Shift+A | | Comment Templates | Auto-generate docstring templates | Various plugins available | | TODO Tracking | Highlight and track TODO comments | Built into most IDEs | | Comment Folding | Collapse/expand comment blocks | Click fold markers |

Documentation Generation

Tools like Sphinx can automatically generate documentation from docstrings, making proper commenting even more valuable.

`python class DatabaseManager: """ Manages database connections and operations. This class provides a high-level interface for database operations, including connection pooling, transaction management, and query execution. Attributes: connection_string (str): Database connection string. pool_size (int): Maximum number of connections in pool. timeout (int): Query timeout in seconds. Example: >>> db = DatabaseManager("postgresql://user:pass@localhost/db") >>> db.connect() >>> result = db.execute_query("SELECT * FROM users") >>> db.disconnect() """ def __init__(self, connection_string, pool_size=10, timeout=30): """ Initialize database manager with connection parameters. Args: connection_string (str): Database connection string. pool_size (int, optional): Maximum connections. Defaults to 10. timeout (int, optional): Query timeout. Defaults to 30. """ self.connection_string = connection_string self.pool_size = pool_size self.timeout = timeout `

Common Comment Mistakes and How to Avoid Them

Understanding common commenting mistakes helps developers write better documentation and avoid pitfalls that reduce code quality.

Over-Commenting

Excessive commenting can clutter code and make it harder to read. Avoid commenting obvious operations or well-written, self-explanatory code.

`python

Bad: Over-commenting obvious operations

x = 5 # Set x to 5 y = 10 # Set y to 10 sum = x + y # Add x and y and store in sum print(sum) # Print the sum

Good: Comment only when necessary

Calculate total cost including tax and shipping

base_cost = 100 tax_rate = 0.08 shipping_cost = 15

total_cost = base_cost * (1 + tax_rate) + shipping_cost print(f"Total cost: ${total_cost:.2f}") `

Outdated Comments

Comments that don't match the current code implementation can mislead developers and cause bugs.

`python

Bad: Outdated comment

This function returns the square of a number

def calculate_power(base, exponent=2): return base exponent

Good: Updated comment

This function calculates base raised to the power of exponent

def calculate_power(base, exponent=2): return base exponent `

Misleading Comments

Comments should accurately describe the code's behavior. Misleading comments are worse than no comments at all.

`python

Bad: Misleading comment

Sort the list in ascending order

numbers.sort(reverse=True) # Actually sorts in descending order

Good: Accurate comment

Sort the list in descending order for ranking display

numbers.sort(reverse=True) `

Performance Considerations

While comments don't affect runtime performance, they can impact development efficiency and code maintenance.

Comment Processing

| Aspect | Impact | Recommendation | |--------|--------|----------------| | Runtime Performance | No impact - comments are ignored | Write comprehensive comments | | File Size | Minimal impact on file size | Don't worry about comment length | | Parse Time | Negligible parsing overhead | Focus on clarity over brevity | | Memory Usage | No memory usage during execution | Comment freely for documentation |

Development Efficiency

Well-written comments significantly improve development efficiency by reducing the time needed to understand and modify code.

`python def complex_algorithm(data, parameters): """ Implements the Smith-Waterman local sequence alignment algorithm. This is a computationally intensive algorithm used in bioinformatics for sequence alignment. The implementation uses dynamic programming with space optimization. Time Complexity: O(m*n) where m and n are sequence lengths Space Complexity: O(min(m,n)) due to space optimization Args: data (tuple): Two sequences to align (seq1, seq2) parameters (dict): Algorithm parameters including: - match_score: Score for matching characters - mismatch_penalty: Penalty for mismatched characters - gap_penalty: Penalty for gaps in alignment Returns: AlignmentResult: Object containing optimal alignment and score """ seq1, seq2 = data match_score = parameters['match_score'] mismatch_penalty = parameters['mismatch_penalty'] gap_penalty = parameters['gap_penalty'] # Initialize scoring matrix with space optimization # Only keep current and previous rows to save memory m, n = len(seq1), len(seq2) prev_row = [0] * (n + 1) curr_row = [0] * (n + 1) # Track maximum score and position for local alignment max_score = 0 max_pos = (0, 0) # Fill scoring matrix using dynamic programming for i in range(1, m + 1): for j in range(1, n + 1): # Calculate scores for all possible moves match = prev_row[j-1] + (match_score if seq1[i-1] == seq2[j-1] else mismatch_penalty) delete = prev_row[j] + gap_penalty insert = curr_row[j-1] + gap_penalty # Take maximum score, but don't go below 0 (local alignment) curr_row[j] = max(0, match, delete, insert) # Update maximum score and position if curr_row[j] > max_score: max_score = curr_row[j] max_pos = (i, j) # Swap rows for next iteration prev_row, curr_row = curr_row, [0] * (n + 1) # Traceback to find optimal alignment (implementation continues...) return perform_traceback(seq1, seq2, max_pos, max_score, parameters) `

Conclusion

Effective commenting is a crucial skill for Python developers that significantly impacts code quality, maintainability, and team collaboration. Comments serve multiple purposes: they document code functionality, explain complex logic, provide context for design decisions, and help future developers understand and modify code efficiently.

The key principles for effective commenting include writing clear and concise explanations, focusing on why rather than what, maintaining comments alongside code changes, and following established style conventions. Different types of comments serve different purposes, from simple inline explanations to comprehensive docstrings that can generate formal documentation.

Modern development practices emphasize the importance of self-documenting code combined with strategic commenting. While code should be written to be as readable as possible, comments provide the additional context and explanation that makes complex systems understandable and maintainable over time.

By following the guidelines and best practices outlined in this guide, developers can create well-documented Python code that stands the test of time and facilitates effective collaboration in software development projects.

Tags

  • Best Practices
  • Programming Basics
  • Python
  • code-documentation
  • syntax

Related Articles

Related Books - Expand Your Knowledge

Explore these Python books to deepen your understanding:

Browse all IT books

Popular Technical Articles & Tutorials

Explore our comprehensive collection of technical articles, programming tutorials, and IT guides written by industry experts:

Browse all 8+ technical articles | Read our IT blog

Python Comments Guide: Single-Line &amp; Multi-Line Examples