Skip to main content Brad's PyNotes

PEP 8: The Python Style Guide That Rules Them All

TL;DR

PEP 8 defines Python’s official coding style guide, emphasizing readability with 4-space indentation, descriptive naming conventions, and the principle that “code is read much more often than it is written.”

Interesting!

PEP 8 introduced the iconic 79-character line limit based on traditional terminal widths - a constraint that sparked decades of debate but ultimately promotes more readable, scannable code.

The Foundation of Readable Python

PEP 8 established the coding conventions that transformed Python from just another scripting language into the epitome of readable programming. Written by Guido van Rossum himself, it codified the principles that make Python code instantly recognizable.

Code Layout Essentials

Indentation Rules

python code snippet start

# Good - 4 spaces per indentation level
def calculate_total(items):
    total = 0
    for item in items:
        if item.is_valid():
            total += item.price
    return total

# Bad - inconsistent indentation
def calculate_total(items):
  total = 0
  # two spaces here...
  for item in items:
    total += item.price
  # eight spaces here...
  for item in items:
          total += item.price
  return total

python code snippet end

Line Length and Breaking

python code snippet start

# Good - readable line breaks
user_permissions = check_user_permissions(
    user_id=current_user.id,
    resource_type='document',
    action='read'
)

# Bad - exceeds 79 characters
user_permissions = check_user_permissions(user_id=current_user.id, resource_type='document', action='read')

python code snippet end

Naming Conventions That Matter

Function and Variable Names

python code snippet start

# Good - lowercase with underscores
def get_user_profile(user_id):
    full_name = f"{user.first_name} {user.last_name}"
    return UserProfile(full_name)

# Bad - camelCase mixing
def getUserProfile(userId):
    fullName = f"{user.firstName} {user.lastName}"
    return UserProfile(fullName)

python code snippet end

Classes and Constants

python code snippet start

# Good - class names use CapWords
class UserAccountManager:
    MAX_LOGIN_ATTEMPTS = 3  # Constants in UPPER_CASE
    
    def __init__(self):
        self.failed_attempts = 0

# Bad - inconsistent naming
class user_account_manager:
    max_login_attempts = 3

python code snippet end

Whitespace Wisdom

Operators and Punctuation

python code snippet start

# Good - consistent spacing
result = (x + y) * (a - b)
items = [1, 2, 3, 4]
user_data = {'name': 'Alice', 'age': 30}

# Bad - inconsistent or excessive spacing
result=(x+y)*(a-b)
items = [ 1 , 2 , 3 , 4 ]
user_data = { 'name' : 'Alice' , 'age' : 30 }

python code snippet end

Documentation Standards

Docstrings Done Right

python code snippet start

def calculate_compound_interest(principal, rate, years):
    """Calculate compound interest for given parameters.
    
    Args:
        principal (float): Initial investment amount
        rate (float): Annual interest rate (as decimal)
        years (int): Number of years to compound
        
    Returns:
        float: Final amount after compound interest
    """
    return principal * (1 + rate) ** years

python code snippet end

When to Break the Rules

PEP 8 itself acknowledges that consistency within a project trumps blind adherence:

python code snippet start

# Sometimes breaking line length makes sense
# for very descriptive variable names or URLs
AUTHENTICATION_SERVICE_URL = "https://api.example.com/v2/authenticate/users/validate"

# Maintain consistency with existing codebase style
# even if it deviates from PEP 8

python code snippet end

Tools for Enforcement

Modern Python development leverages automated tools:

  • autopep8: Automatically formats code to PEP 8
  • black: Opinionated formatter that goes beyond PEP 8
  • flake8: Linting tool for style violations
  • pylint: Comprehensive code analysis

PEP 8 transformed Python development by establishing clear, logical conventions that prioritize human readability. While tools can enforce the rules, understanding the philosophy behind them makes you a better Python developer.

These practical style guidelines perfectly complement the Zen of Python's philosophical principles , turning abstract ideals into concrete coding practices. The naming conventions shown here apply to built-in function usage and class design patterns throughout Python development.

Reference: PEP 8 - Style Guide for Python Code