파이썬/기초 프로그래밍

_wrapfunc()는 NumPy 내부에서 정의한 유틸리티 함수

Data Jun 2025. 3. 27. 16:53

_wrapfunc()는 NumPy 라이브러리 내부에 구현된 함수입니다.
사용자에게 직접 노출되는 API는 아니지만,
np.round, np.sum, np.mean 등 우리가 자주 사용하는 전역 함수들의 핵심 연결고리 역할을 합니다.

 

어디에 정의되어 있을까?

보통 numpy/core/fromnumeric.py 파일 안에 다음과 비슷한 형태로 정의되어 있습니다:

def _wrapfunc(obj, method, *args, **kwds):
    try:
        return getattr(obj, method)(*args, **kwds)
    except AttributeError:
        return _wrapit(obj, method, *args, **kwds)

이 함수는 객체(obj)가 가진 메서드를 문자열(method)로 찾아서 실행하고,
예외가 발생하면 _wrapit()이라는 보조 로직으로 처리합니다.

 

getattr()은 뭘까?

getattr(obj, 'method')

이건 말 그대로, obj.method라는 메서드(또는 속성)를 "문자열"로 받아서 꺼내는 것입니다.

 

예:

class A:
    def hello(self):
        print("hi")

a = A()
method = getattr(a, 'hello')  # 이건 a.hello 와 동일한 결과

이때 method는 함수 객체가 됩니다. 하지만 아직 **호출(call)**은 안 한 상태예요.

 

()가 두 번 나오는 이유

getattr(obj, 'method')(*args, **kwargs)

이건 이렇게 나눠서 보면 됩니다:

  1. getattr(obj, 'method') → 메서드 객체를 가져온다
  2. (...) → 그 메서드를 호출한다

즉, 아래 두 줄은 완전히 동일한 의미예요:

func = getattr(obj, 'round')   # ① 메서드 가져옴
func(decimals=2)               # ② 실행

# == 아래 한 줄로 줄인 것
getattr(obj, 'round')(decimals=2)

 

요약: getattr(...)(...) 구조란?

그래서 괄호가 두 번 붙는 거예요:

  • 첫 번째 괄호: getattr(...) → "메서드 가져오기"
  • 두 번째 괄호: (...) → "가져온 메서드 호출하기"

 

실생활 비유

getattr(...)는 리모컨에서 버튼을 꺼낸 것
(...)는 그 버튼을 "눌러서" 실제 기능을 실행한 것

 

유틸리티 함수란?

**유틸리티 함수(utility function)**란, 코드 내에서 반복되거나 공통적으로 필요한 기능을 따로 분리해 둔 보조 함수입니다. 

  • 사용자가 반복해서 호출하는 함수"가 아니라, 코드 내부에서 반복적으로 쓰이는 로직을 함수로 분리한 것"이에요.
  • NumPy에서는 _wrapfunc()처럼 여러 전역 함수가 공통적으로 사용하는 로직을 유틸리티 함수로 정의하여 재사용성과 유지보수성을 높이고 있습니다. 

 

 

 

 

핵심 요약

  • _wrapfunc()는 NumPy 내부 구현용 유틸리티 함수
  • 반복되는 "객체에서 메서드 찾아 실행" 패턴을 공통 처리
  • 외부 사용자는 직접 쓸 일은 없지만, 많은 함수의 핵심 연결 구조