from contextlib import contextmanager
@contextmanager
def timer(label):
import time
start = time.perf_counter()
try:
yield
finally:
print(f"{label}: {time.perf_counter() - start:.3f} ثانیه")
هر چیزی که «گرفتن و آزادکردن» دارد (فایل، قفل، اتصال، تراکنش) باید زمینهبان باشد. finally داخلِ مولد تضمین میکند آزادسازی حتی با استثنا هم اجرا شود. برای چند منبع، withهای تودرتو یا ExitStack؛ و برای تستِ کدِ دارای زمینهبان، همان unittest معمولی کافی است.
اشتباه رایج
زمینهبان فقط برای فایل است.
تصحیح
فایل فقط معروفترین مثال است. قفل ریسه، اتصال پایگاهداده، تغییر موقت دایرکتوری و زمانسنجی همه زمینهباناند.