Metaprogramming

Metaprogramming is the practice of writing code that manipulates or generates other code. In Python, this means writing programs that can modify, generate, or analyze other parts of your program while it runs.

The fundamental idea is simple: in Python, everything (including classes and functions) is an object that can be modified at runtime. This means your code can examine and change itself as it executes.

Why Use Metaprogramming?

Metaprogramming helps eliminate repetitive code by automating patterns. Instead of writing similar code multiple times, you write code that generates code for you. Common uses include:

  • Creating flexible APIs
  • Building class factories
  • Implementing decorators
  • Adding automatic logging or validation
  • Creating domain-specific languages

When to Use Metaprogramming

Use metaprogramming when it significantly reduces complexity or eliminates repetition. Avoid it when simpler approaches would work just as well. Remember: code that writes code should make complex problems simpler, not simple problems complex.

Python Metaprogramming Example

Here’s a simple example of metaprogramming using a class factory:

Python
def create_logger_class(name):
    """
    Creates a class with automatic logging of method calls.
    """
    class Logger:
        def __init__(self):
            self.name = name

        def log(self, message):
            print(f"[{self.name}] {message}")

        def __getattr__(self, method_name):
            # Automatically log any method call
            def method(*args):
                self.log(f"Called {method_name} with args: {args}")
            return method

    return Logger

# Create different logger classes
DebugLogger = create_logger_class("DEBUG")
ErrorLogger = create_logger_class("ERROR")

# Usage
debug = DebugLogger()
debug.save("mydata") # Prints: [DEBUG] Called save with args: ('mydata',)
debug.send("msg")    # Prints: [DEBUG] Called send with args: ('msg',)

This example shows how metaprogramming can create classes dynamically and handle method calls that don’t exist. The class factory generates new classes with custom behavior, and the __getattr__ magic method intercepts calls to undefined methods.

Learning Path

Python Metaprogramming

Elevate your Python skills by mastering metaprogramming. Explore metaclasses, descriptors, and dynamic code execution using exec() and eval(). Ideal for advanced users wanting to harness Python's dynamic capabilities.

advanced python

For additional information on related topics, take a look at the following resources:


By Dan Bader • Updated Jan. 7, 2025