📋
Code Snippet — August 8, 2026Python: Context Manager for Temporary Environment VariablesMutating
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.