_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)
이건 이렇게 나눠서 보면 됩니다:
- getattr(obj, 'method') → 메서드 객체를 가져온다
- (...) → 그 메서드를 호출한다
즉, 아래 두 줄은 완전히 동일한 의미예요:
func = getattr(obj, 'round') # ① 메서드 가져옴
func(decimals=2) # ② 실행
# == 아래 한 줄로 줄인 것
getattr(obj, 'round')(decimals=2)
요약: getattr(...)(...) 구조란?
그래서 괄호가 두 번 붙는 거예요:
- 첫 번째 괄호: getattr(...) → "메서드 가져오기"
- 두 번째 괄호: (...) → "가져온 메서드 호출하기"
실생활 비유
getattr(...)는 리모컨에서 버튼을 꺼낸 것
(...)는 그 버튼을 "눌러서" 실제 기능을 실행한 것
유틸리티 함수란?
**유틸리티 함수(utility function)**란, 코드 내에서 반복되거나 공통적으로 필요한 기능을 따로 분리해 둔 보조 함수입니다.
- 사용자가 반복해서 호출하는 함수"가 아니라, 코드 내부에서 반복적으로 쓰이는 로직을 함수로 분리한 것"이에요.
- NumPy에서는 _wrapfunc()처럼 여러 전역 함수가 공통적으로 사용하는 로직을 유틸리티 함수로 정의하여 재사용성과 유지보수성을 높이고 있습니다.
핵심 요약
- _wrapfunc()는 NumPy 내부 구현용 유틸리티 함수
- 반복되는 "객체에서 메서드 찾아 실행" 패턴을 공통 처리
- 외부 사용자는 직접 쓸 일은 없지만, 많은 함수의 핵심 연결 구조임
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
Python 함수에서 ... (Ellipsis)의 의미는? (0) | 2025.05.14 |
---|---|
NumPy의 _wrapfunc()는 뭘 할까? — np.round()의 진짜 동작 방식 (0) | 2025.03.27 |
파이썬에서 _internal.py 같은 모듈은 왜 언더바로 시작할까? (0) | 2025.03.27 |
파이썬 스페셜 메서드는 왜 꼭 정해진 이름을 써야 할까? (0) | 2025.03.27 |
파이썬 hasattr() 제대로 이해하기 – 반복 가능한 객체 판별 (0) | 2025.03.27 |