함수 서명 가져오기
이 자습서에서는 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
Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.
LinkedIn