그러나 C 확장 모듈을 만드는 대신 ctypes를 사용하는 경우 몇 가지 중요한 단점도 있다.
• ctypes에서는 C에서 표현할 수 있는 데이터 타입만 쓸 수 있다. 매우 흔히 쓰이는 기능인 이터레이터(아이템 21 “인자에 대해 이터레이션할 때는 방어적으로 접근하라” 참조)나 덕 타이핑(아이템 25 “딕셔너리 삽입 순서에 의존할 때는 조심하라” 참조) 등을 포함해, 파이썬의 표현력을 대부분 잃게 된다. ctypes를 통해 가져온 네이티브 함수는 래퍼로 감싼 경우라 해도 파이썬 개발자에게 어색하게 느껴질 수 있으며, 생산성을 저하시킬 수 있다.
• ctypes를 사용할 때 적절한 데이터 타입을 맞추기 위해 함수 입력과 출력을 복사하거나 변환해야 하는 경우가 많다. 이로 인해 발생하는 부가비용이 네이티브 라이브러리를 사용하는 성능상 이점을 갉아먹을 수 있고, 결과적으로 최적화 자체가 무의미해질 수 있다. 반면 C 확장 모듈에서는 복사를 우회할 수 있어서, 속도 한계는 기저 데이터 타입의 근본적인 성능에 의해 결정된다.
• ctypes를 조금만 잘못 사용해도 프로그램이 자신의 메모리를 손상시켜서 이상하게 작동할 수 있다. 예를 들어 함수 인자나 반환 값으로 ctypes.c_int를 사용해야 하는 곳에 실수로 ctypes.c_double을 전달하면, 예측할 수 없는 충돌이 발생하고 읽기 어려운 오류 메시지가 출력될 수 있다. 이런 문제를 추적할 때 내장 모듈인 faulthandler가 도움이 되지만, 여전히 디버깅하기 어렵다.