Advanced Closures
Closure patterns, nonlocal, and practical applications.
Overview
Master advanced closure patterns.
Closure with State
def make_counter(start=0):
count = [start]
def counter():
count[0] += 1
return count[0]
counter.reset = lambda: count.__setitem__(0, start)
return counter
counter = make_counter(10)
print(counter()) # 11
print(counter()) # 12
counter.reset()
print(counter()) # 11
nonlocal Keyword
def make_averager():
series = []
def averager(new_value):
series.append(new_value)
return sum(series) / len(series)
return averager
avg = make_averager()
print(avg(10)) # 10.0
print(avg(20)) # 15.0
print(avg(30)) # 20.0
Practical Applications
# Configuration factory
def make_config(defaults):
config = defaults.copy()
def update(key, value):
config[key] = value
def get(key, default=None):
return config.get(key, default)
def reset():
config.clear()
config.update(defaults)
update.get = get
update.reset = reset
return update
config = make_config({"timeout": 30, "retries": 3})
config("timeout", 60)
print(config.get("timeout")) # 60
Practice
Implement a memoization closure for recursive functions.