더북(TheBook)

이 확장 모듈을 작성하는 데 상당한 노력이 필요했지만, 인터페이스의 사용성은 ctypes 모듈을 사용했을 때와 거의 동일하다. 즉, dot_product 함수의 두 인자로 반드시 float을 포함하는 리스트를 사용해야 한다. 만약 C 확장 모듈을 이 정도 수준까지 구현하는 것이 목적이라면, 굳이 그럴 필요가 없다. 이 정도 수준에서는 C 확장 API가 제공하는 가장 가치 있는 기능을 활용하지 못한다.

이제 파이썬 API가 제공하는 이터레이터와 숫자 프로토콜을 활용하는 확장 모듈을 구현할 것이다. 이 버전은 60줄의 코드로 이뤄졌지만(앞에서 본 간단한 dot_product 함수보다 50% 더 길고, 아이템 94에서 본 기본 C 버전보다 6배 더 길다), 이 방식은 파이썬의 강력한 기능을 최대한 활용할 수 있도록 해준다. PyObject_GetIterPyIter_Next API를 사용하면, 입력 타입으로 튜플, 리스트, 제너레이터 등의 모든 이터러블 컨테이너를 지원할 수 있다(아이템 21 “인자에 대해 이터레이션할 때는 방어적으로 접근하라” 참조) PyNumber_MultiplyPyNumber_Add API를 사용하면 수에 대한 특별 메서드를 적절히 구현한 모든 객체를 이터레이터에서 가져오는 값으로 쓸 수 있다(아이템 57 “커스텀 컨테이너 타입은 collections.abc를 상속하라” 참조).