HOWTO · Python

함수 서명 가져오기

Python에서 함수 호출 세부 정보를 얻는 방법에 대한 짧은 자습서입니다.

이 페이지의 내용

이 자습서에서는 Python을 사용하여 함수 호출 세부 정보를 빠르게 가져오는 몇 가지 방법에 대해 설명합니다. 이는 대규모 코드베이스를 분석할 때 특히 유용하며 한 눈에 함수가 수행하는 작업을 파악하기가 어려워집니다.

코드를 앞뒤로 이동하는 대신 signature() 함수와 데코레이터를 사용하여 이 정확한 문제에 대한 보다 스마트한 솔루션을 제공합니다.

signature()를 사용하여 Python에서 함수 호출 세부 정보 가져오기

이 정보를 얻는 가장 쉬운 방법은 inspect.signature() 기능을 사용하는 것입니다. Python 3.5+용 문서는 이 기능을 사용할 것을 권장합니다.

inspect.signature()는 다양한 콜러블을 허용합니다. 여기에는 함수, 클래스 및 functools.partial() 객체가 포함됩니다.

이 함수는 콜러블의 주석을 반환합니다. 서명을 제공할 수 없는 경우 함수는 ValueError를 발생시킵니다. 객체 유형이 지원되지 않으면 TypeError가 발생합니다.

예제 코드:

import inspect


def foo(x, y, a="anything"):
    pass


print(inspect.signature(foo))

터미널에 다음을 인쇄해야 합니다.

(x, y, a="anything")

데코레이터를 사용하여 Python에서 함수 호출 세부 정보 얻기

Python의 함수에는 사용할 수 있는 몇 가지 특성이 있습니다. 이러한 속성 중에는 __code__가 있습니다.

__code__ 속성에는 추가로 사용할 수 있는 속성이 있습니다. 아래에서 각각의 기능을 설명하는 목록을 찾을 수 있습니다.

그 아래에는 이 작업을 수행할 수 있는 함수를 작성하는 코드 스니펫이 포함됩니다. 함수 이름을 얻기 위해 __name__ 속성을 사용합니다.

  1. co_varnames는 함수에 전달된 인수 이름과 함수 내에서 사용된 지역 변수의 튜플을 반환합니다.

  2. co_argcount는 인수의 수를 반환합니다. 그러나 이 수에는 키워드 전용 인수(kwargs), *args**args가 제외됩니다.

    스니펫에 이러한 모든 인수를 인쇄하는 방법이 포함되어 있습니다.

def get_func_dets(func):
    # the point of using argcount is to ensure we only get
    argument_names = func.__code__.co_varnames[: func.__code__.co_argcount]
    func_name = func.__name__

    # getting variable length arguments and keyword arguments
    def inner_fun(*args, **kwargs):
        print(func_name, "(", end="")

        print(
            ", ".join(
                "%s = %r" % ent
                for ent in zip(argument_names, args[: len(argument_names)])
            ),
            end=", ",
        )

        print("args = ", list(args[len(argument_names) :]), end=",")
        print("kwargs =", kwargs, end="")
        print(")")

    return inner_func