← Back to Blog
Code Snippets August 8, 2026

Python: Context Manager for Temporary Environment Variables

📋 Code Snippet — August 8, 2026

Python: Context Manager for Temporary Environment Variables

Mutating os.environ directly is one of the most common sources of subtle test failures. This pattern guarantees cleanup even on exceptions:

import os
from contextlib import contextmanager

@contextmanager
def env_vars(**changes):
    """Temporarily set env vars with guaranteed restore."""
    previous = {}
    for key, value in changes.items():
        previous[key] = os.environ.get(key)
        os.environ[key] = value
    try:
        yield
    finally:
        for key, old_value in previous.items():
            if old_value is None:
                os.environ.pop(key, None)
            else:
                os.environ[key] = old_value

@contextmanager
def env_unset(*keys):
    """Temporarily remove env vars."""
    previous = {}
    for key in keys:
        previous[key] = os.environ.get(key)
        os.environ.pop(key, None)
    try:
        yield
    finally:
        for key, old_value in previous.items():
            if old_value is not None:
                os.environ[key] = old_value


Usage:
# Set temporarily
with env_vars(DEBUG='1', DATABASE_URL='sqlite:///:memory:'):
    run_tests()
# Both vars restored automatically

# Nested calls are safe
with env_vars(MODE='a'):
    with env_vars(MODE='b'):
        pass
    # MODE restored to 'a'
# MODE fully restored

# Temporarily remove a var
with env_unset('API_KEY'):
    test_missing_key()
# API_KEY restored


Pro tip: Combine with pytest fixtures for isolated test environments. The context manager saves the previous state (including None for keys that didn't exist) and restores atomically in finally.