API의 함수를 변경하는 것: 훅
파이썬은 KEY파라미터를 활용하여 변경이 가능
파이썬은 일급 시민 객체이다.
# 디폴트 값이 훅이 존재하지 않는 키에 접근한 총 횟수
# 클로저 , 도우미 함수 활용
def increment_with_report(current, increments):
added_count = 0
def missing():
nonlocal added_count #상태가 있는 클로저
added_count +=1
return 0
result = defaultdict(missing, current)
for key, amount in increments:
result[key] += amount
return result, added_count
result, count = increment_with_report(current, increments)
assert count ==2
#클래스의 명목화
#defaultdict의 디폴트 값 훅으로 사용해서 존재하지 않는 키에 접근한 횟수 추적
"""
모든 객체를 호출 가능한 객체
"""
class BetterCountMissing:
def __init__(self):
self.added = 0
def __call__(self):
self.added = 1
return 0
counter = BetterCountMissing()
assert counter() == 0
assert callable(counter)
counter = BetterCountMissing()
result = defaultdict(counter, current) #__call__에 의존
for key, amount in increments:
result[key] += amount
assert counter.added == 2
파이썬의 여러 컴포넌트 사이에 간단한 인터페이스가 필요할 때는 클래스를 정의하고 인스턴스화하는 대신 간단한 함수 사용
파이썬 함수나 메서드는 일급 시민으로 함수나 함수 참조를 식에 사용
call특별 메서드를 사용하면 클래스의 인스턴스인 객체를 일반 파이썬 함수처럼 호출
상태를 유지하기 위해서 함수가 필요한 경우 상태있는 클로저를 정의하는 대신 call메서드가 있는 클래스 정의