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__ 속성을 사용합니다.
-
co_varnames는 함수에 전달된 인수 이름과 함수 내에서 사용된 지역 변수의 튜플을 반환합니다. -
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