파이썬/타입 힌트

Python 타입힌트: Callable 활용법

Data Jun 2025. 9. 10. 14:47

Python에서 함수는 일급 객체(first-class citizen)로, 다른 함수의 인자로 넘기거나 반환값으로 활용할 수 있습니다. 이때 함수 타입을 명시적으로 지정하고 싶다면 typing 모듈의 Callable 타입힌팅을 사용할 수 있습니다.

이번 글에서는 Callable의 기본적인 사용법부터, 여러 인자를 받는 경우, 그리고 반환 타입을 또 다른 Callable로 지정하는 방법까지 예제를 통해 살펴보겠습니다.

 

기본 타입 지정

가장 간단한 형태는 하나의 인자를 받고 특정 타입을 반환하는 함수를 정의할 때입니다.

from typing import Callable

# int → str 함수 타입을 인자로 받음
def apply_func(x: int, func: Callable[[int], str]) -> str:
    return func(x)

# 사용 예시
result = apply_func(5, lambda n: f"Number: {n}")
print(result)  # 출력: "Number: 5"

위 예제에서 func의 타입은 Callable[[int], str] 입니다. 즉, int를 입력받아 str을 반환하는 함수만 인자로 전달할 수 있습니다.

 

여러 인자 타입 지정

Callable은 여러 개의 인자를 받는 함수 타입도 정의할 수 있습니다. 인자의 타입을 리스트 형식으로 차례대로 나열하면 됩니다.

from typing import Callable

# (int, int) → float 함수 타입
def operate(a: int, b: int, op: Callable[[int, int], float]) -> float:
    return op(a, b)

# 사용 예시
print(operate(10, 3, lambda x, y: x / y))  # 3.333...
print(operate(10, 3, lambda x, y: x * y))  # 30.0

이 경우 operate는 두 개의 int를 입력받아 float을 반환하는 함수여야 합니다.

 

반환 타입이 또 다른 Callable인 경우

 

조금 더 고급 예제로, 함수가 또 다른 함수를 반환하는 경우를 타입힌팅으로 표현할 수도 있습니다.

from typing import Callable

# int를 받아 Callable[[str], str]을 반환하는 함수 타입
def make_repeater(n: int) -> Callable[[str], str]:
    def repeater(text: str) -> str:
        return text * n
    return repeater

# 사용 예시
repeat_three = make_repeater(3)
print(repeat_three("Hi"))  # 출력: "HiHiHi"

여기서 make_repeater의 반환 타입은 Callable[[str], str]입니다. 즉, 문자열을 받아 문자열을 반환하는 함수를 리턴한다는 의미입니다.

 

정리

  • Callable은 호출 가능한 객체(함수, 람다, functor 등) 의 타입을 정의할 때 사용
  • 기본 형태: Callable[[ArgType1, ArgType2, ...], ReturnType]
  • 인자가 여러 개일 경우 리스트로 나열
  • 반환 타입도 Callable로 지정 가능 → 고차 함수(higher-order function) 표현에 유용

타입힌팅을 활용하면 함수형 프로그래밍 패턴에서 코드의 가독성과 안정성을 높일 수 있습니다.