파이썬 inspect 모듈을 빠르게 사용하기 위한 치트시트입니다. 함수 시그니처, 소스 코드 조회, 스택 프레임, 클래스 계층 분석 등 런타임 객체 검사 패턴을 최소 예제로 정리합니다.
inspect 모듈은 런타임에 객체를 검사하는 도구입니다. 함수 시그니처 분석, 소스 코드 조회, 스택 추적 등 메타프로그래밍과 디버깅에 필수적입니다.
언제 이 치트시트를 보나?
함수의 매개변수 정보를 동적으로 알아야 할 때
소스 코드를 런타임에 조회하고 싶을 때
호출 스택을 분석하거나 caller 정보가 필요할 때
핵심 함수
1
2
3
4
5
6
7
8
9
10
11
12
13
importinspect# 타입 체크inspect.isfunction(obj)# 함수인가?inspect.ismethod(obj)# 메서드인가?inspect.isclass(obj)# 클래스인가?inspect.ismodule(obj)# 모듈인가?# 정보 조회inspect.signature(func)# 함수 시그니처inspect.getsource(obj)# 소스 코드inspect.getfile(obj)# 파일 경로inspect.getmembers(obj)# 멤버 목록
importinspectdefmy_function():"""샘플 함수"""return42# 소스 코드print(inspect.getsource(my_function))# def my_function():# """샘플 함수"""# return 42# 파일과 라인 번호print(inspect.getfile(my_function))# 파일 경로print(inspect.getsourcelines(my_function))# (소스라인리스트, 시작라인)# 독스트링print(inspect.getdoc(my_function))# 샘플 함수
importinspectdefinner():# 현재 스택stack=inspect.stack()forframe_infoinstack:print(f"{frame_info.function} at {frame_info.filename}:{frame_info.lineno}")# 호출자 정보caller=inspect.stack()[1]print(f"Called by: {caller.function}")defouter():inner()outer()# inner at <file>:5# outer at <file>:13# <module> at <file>:15# Called by: outer
importinspectfromfunctoolsimportwrapsdefvalidate_types(func):"""타입 힌트 기반 자동 검증 데코레이터"""sig=inspect.signature(func)@wraps(func)defwrapper(*args,**kwargs):bound=sig.bind(*args,**kwargs)bound.apply_defaults()forparam_name,valueinbound.arguments.items():param=sig.parameters[param_name]expected_type=param.annotationifexpected_type!=inspect.Parameter.empty:ifnotisinstance(value,expected_type):raiseTypeError(f"{param_name} must be {expected_type.__name__}, "f"got {type(value).__name__}")returnfunc(*args,**kwargs)returnwrapper@validate_typesdefadd(a:int,b:int)->int:returna+badd(1,2)# OK# add(1, "2") # TypeError: b must be int, got str
importinspect# 객체 타입 검사inspect.ismodule(obj)# 모듈inspect.isclass(obj)# 클래스inspect.isfunction(obj)# 함수 (def로 정의)inspect.ismethod(obj)# 바운드 메서드inspect.isgeneratorfunction(obj)# 제너레이터 함수inspect.iscoroutinefunction(obj)# async 함수inspect.isabstract(obj)# 추상 클래스/메서드# 정보 조회inspect.getmodule(obj)# 객체가 정의된 모듈inspect.getfile(obj)# 파일 경로inspect.getsourcefile(obj)# 소스 파일 경로inspect.getcomments(obj)# 선행 주석
자주 하는 실수
1. 빌트인 함수에 getsource 시도
1
2
3
4
5
6
7
8
importinspect# TypeError: <built-in function len> is not a Python object# inspect.getsource(len)# 해결: 먼저 검사ifinspect.isfunction(obj):# 빌트인은 Falsesource=inspect.getsource(obj)
2. 람다 소스 코드 조회
1
2
3
4
5
importinspectf=lambdax:x*2# 한 줄로만 반환됨, 복잡한 람다는 정확하지 않을 수 있음print(inspect.getsource(f))# f = lambda x: x * 2