inspect — 라이브 객체 검사하기
inspect — 라이브 객체 검사하기
inspect 모듈는 모듈, 클래스, 메서드, 함수, 트레이스백, 프레임 객체, 코드 객체 같은 라이브 객체에 대한 유용한 정보를 얻는 데 도움을 줘요. 타입 검사, 소스 가져오기, 클래스·함수·메서드 검사, 호출 시그니처 얻기, 인터프리터 스택 검사하는 데 쓸 수 있어요.
출처: Python 표준 라이브러리
타입 검사 : is* 함수들
inspect.ismodule(object),inspect.isclass(object),inspect.ismethod(object),inspect.isfunction(object),inspect.isgeneratorfunction(object),inspect.isgenerator(object),inspect.iscoroutinefunction(object),inspect.iscoroutine(object),inspect.isbuiltin(object),inspect.isroutine(object)— 해당 타입이면True를 반환해요.
멤버/소스 검사
inspect.getmembers(object[, predicate])— 객체의 모든 멤버를(name, value)튜플 리스트로 반환해요.predicate를 주면 그 조건을 만족하는 멤버만 돌려줍니다.
>>> import inspect
>>> inspect.getmembers(str, inspect.isfunction)
[('capitalize', <method 'capitalize' of 'str' objects>), ...]
inspect.getmodule(object)— 객체가 정의된 모듈을 추정해 반환해요.inspect.getfile(object)— 객체가 정의된 텍스트 파일의 이름을 반환해요.inspect.getsource(object)— 객체의 소스 텍스트를 반환해요.inspect.getsourcelines(object)— 소스를(소스 줄 리스트, 시작 줄 번호)로 반환해요.inspect.getsourcefile(object)— 소스 파일의 경로를 반환해요.inspect.getdoc(object)— 객체의 독스트링을 정리해서 반환해요.inspect.getcomments(object)— 객체 바로 앞의 주석을 반환해요.
시그니처 검사
inspect.signature(callable, *, follow_wrapped=True, globals=None, locals=None, eval_str=False)— 호출 가능 객체의 시그니처를 나타내는Signature객체를 반환해요.
>>> import inspect
>>> def add(a: int, b: int = 2) -> int:
... return a + b
...
>>> sig = inspect.signature(add)
>>> print(sig)
(a: int, b: int = 2) -> int
>>> list(sig.parameters)
['a', 'b']
inspect.Signature— 호출 가능 객체의 시그니처.parameters는Parameter객체의 순서 있는 매핑이고,return_annotation으로 반환형을 얻어요.inspect.Parameter— 단일 매개변수를 나타내며.name,.default,.annotation,.kind속성을 가져요.inspect.Parameter.POSITIONAL_ONLY,POSITIONAL_OR_KEYWORD,VAR_POSITIONAL,KEYWORD_ONLY,VAR_KEYWORD— 매개변수 종류 상수.inspect.BoundArguments.bind(*args, **kwargs)— 인자들을 시그니처에 바인딩한BoundArguments객체를 반환해요.
>>> sig.bind(1, b=3)
<BoundArguments (a=1, b=3)>
inspect.getfullargspec(func)— 레거시 시그니처 조회(튜플을 반환).inspect.signature사용이 권장돼요.
프레임·트레이스백 검사
inspect.currentframe()— 현재 실행 중인 프레임 객체를 반환해요.inspect.getouterframes(frame)— 호출 스택의 프레임 정보 목록을 반환해요.inspect.getinnerframes(traceback)— 트레이스백의 프레임 정보 목록을 반환.inspect.stack()— 호출 스택을 프레임 정보(프레임, 파일명, 줄 번호 등) 목록으로 반환해요.inspect.trace()— 현재 예외의 트레이스백 프레임 정보 반환.inspect.FrameInfo/inspect.Traceback— 프레임 정보를 담는 named tuple로,.frame,.filename,.lineno,.function,.code_context,.index를 가져요.
디버깅·로깅에서 호출자를 찾을 때 inspect.stack()[1].function 같은 형태로 자주 쓰입니다.
코루틴 관련
inspect.isawaitable(object)— 객체가 awaitable이면 참.inspect.iscoroutinefunction(object)— 코루틴 함수(비동기 함수)인지 확인.inspect.getcoroutinestate(coro)— 코루틴의 현재 상태(예:'CORO_CREATED','CORO_RUNNING','CORO_CLOSED')를 반환.
클래스 관련
inspect.getclasstree(classes, unique=False)— 주어진 클래스들의 계층을 중첩 리스트로 정렬해 반환.inspect.getmro(cls)— 클래스의 메서드 해석 순서(MRO)를 반환.
예제
객체의 모든 공개 메서드를 나열하는 예:
import inspect
class Sample:
def hello(self):
return "hi"
def _private(self):
return "secret"
for name, member in inspect.getmembers(Sample, inspect.isfunction):
if not name.startswith('_'):
print(name, member)
함수 시그니처를 문자열로 얻는 예:
import inspect
def greet(name, *, punctuation='!'):
return f"Hello {name}{punctuation}"
print(inspect.signature(greet)) # (name, *, punctuation='!')