Python

[Python] singledispatch - Overloading 하기

비번변경 2024. 9. 12. 12:30

개요

2024.08.28-[Python] multipledispatch - Overloading 하기에서 Python에서 Overloading을 구현하는 방법에 대해서 정리했었는데, multipledispatch가 아니라 functools의 singledispatch를 이용한 방법도 존재하는 것 같아서 적어둔다.

 

 

singledispatch

functools 라이브러리에서 제공하는 singledispatch는 함수를 인자 하나의 데이터 타입에 따라 구현이 결정되는 제네릭 함수로 변환하는 기능을 제공한다.

 

❓ 제네릭(Generic) 이란?
하나의 값이 여러 데이터 타입을 가질 수 있는 기술에 중점을 두어 재사용성을 높이는 프로그래밍 방식
함수 등을 정의할 때 인자에 구애받지 않고 같은 이름의 함수를 인자 타입에 따라 반복적으로 정의하지 않아도 되게끔 도와주는 정적 언어의 편의 장치

같은 연산을 서로 다른 데이터 타입에 대해 구현한 여러 함수로 구성된 함수를 제네릭 함수라고 한다.

 

아래와 같이 import해서 사용할 수 있다.

from functools import singledispatch

 

 

사용 예시

singledispatch는 데코레이터를 사용하여 매개변수의 데이터 타입이 정의되어 있지 않은 함수를 생성한 후, register 데코레이터를 사용하여 매개변수의 데이터 타입을 지정한 함수를 생성하는 방식으로 사용한다.

참고로 singledispatch는 multipledispatch와 다르게 함수의 첫 번째 매개변수에 대해서만 적용된다.

 

아래 코드는 타입을 지정하지 않은 일반적인 함수를 선언한 것이다.

from functools import singledispatch


@singledispatch
def print_format(arg):
    print(f"This is dafault fucntion. {arg}")

 

이제 arg 매개변수의 타입을 지정해본다. 매개변수의 타입을 지정할 때는 @<함수명>.register 데코레이터를 사용한다.

@print_format.register
def _(arg: str):
    print(f"String print. {arg}")

타입 어노테이션을 사용하여 매개변수의 데이터 타입을 지정하면 데코레이터가 매개변수의 데이터 타입을 자동으로 유추한다.

또는 타입 어노테이션을 사용하는 것 대신 register 데코레이터에 타입을 지정해도 된다.

@print_format.register(int)
def _(arg):
    print(f"Integer print. {arg}")

 

이제 아래와 같이 리스트, 문자열, 숫자 데이터를 전달하여 print_format이라는 함수를 호출하면 다음과 같은 결과를 얻을 수 있다.

 

 

참고 문서

https://docs.python.org/ko/3/glossary.html#term-single-dispatch

파이썬에서 제네릭 함수 정의하기 – singledispatch