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 — 호출 가능 객체의 시그니처. parametersParameter 객체의 순서 있는 매핑이고, 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='!')

더 알아보기