더북(TheBook)

BETTER WAY 23
인터페이스가 간단하면 클래스 대신 함수를 받자

 

 

파이썬 내장 API의 상당수에는 함수를 넘겨서 동작을 사용자화하는 기능이 있다. API는 이런 후크(hook)를 이용해서 여러분이 작성한 코드를 실행 중에 호출한다. 예를 들어 list 타입의 sort 메서드는 정렬에 필요한 각 인덱스의 값을 결정하는 선택적인 key 인수를 받는다. 다음 코드에서는 lambda 표현식을 key 후크로 넘겨서 이름 리스트를 길이로 정렬한다.

names = [‘Socrates’, ‘Archimedes’, ‘Plato’, ‘Aristotle’]

names.sort(key=lambda x: len(x))

print(names)

 

>>>

[‘Plato’, ‘Socrates’, ‘Aristotle’, ‘Archimedes’]

 

다른 언어에서라면 후크를 추상 클래스로 정의할 것이라고 예상할 수도 있다. 하지만 파이썬의 후크 중 상당수는 인수와 반환 값을 잘 정의해놓은 단순히 상태가 없는 함수다. 함수는 클래스보다 설명하기 쉽고 정의하기도 간단해서 후크로 쓰기에 이상적이다. 함수가 후크로 동작하는 이유는 파이썬이 일급 함수(first-class function)를 갖췄기 때문이다. 다시 말해, 언어에서 함수와 메서드를 다른 값처럼 전달하고 참조할 수 있기 때문이다.

예를 들어 defaultdict 클래스의 동작을 사용자화한다고 해보자(Better way 46 “내장 알고리즘과 자료 구조를 사용하자”에서 자세하게 설명한다). 이 자료 구조는 찾을 수 없는 키에 접근할 때마다 호출될 함수를 받는다. defaultdict에 넘길 함수는 딕셔너리에서 찾을 수 없는 키에 대응할 기본값을 반환해야 한다. 다음은 키를 찾을 수 없을 때마다 로그를 남기고 기본값으로 0을 반환하는 후크를 정의한 코드다.

def log_missing():

print(‘Key added’)

return 0

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.