Python – 获取函数签名
让我们考虑一个场景,您编写了非常长的代码并想知道函数调用的详细信息。因此,您可以做的是每次滚动浏览您的代码,以了解不同的功能以了解它们的详细信息,或者您可以巧妙地工作。您可以创建一个代码,您可以在其中获取函数详细信息,而无需滚动代码。这可以通过两种方式实现——
- 使用签名()函数
- 使用装饰器
使用签名()函数
我们可以借助signature()函数获取函数Signature 。它将 callable 作为参数并返回注解。如果没有提供签名,它会引发一个值 Error。如果给出了无效的类型对象,那么它会引发类型错误。
句法:
inspect.signature(callable, *, follow_wrapped=True)
示例 1:
from inspect import signature
# declare a function gfg with some
# parameter
def gfg(x:str, y:int):
pass
# with the help of signature function
# store signature of the function in
# variable t
t = signature(gfg)
# print the signature of the function
print(t)
# print the annonation of the parameter
# of the function
print(t.parameters['x'])
# print the annonation of the parameter
# of the function
print(t.parameters['y'].annotation)
输出
(x:str, y:int)
x:str
使用装饰器
为此, Python中的某些属性的函数。一种这样的属性是 __code__ ,它返回被调用的函数字节码。 __code__ 属性还具有某些有助于我们执行任务的属性。我们将使用 co_varnames 属性返回参数名称和局部变量的元组,以及 co_argcount 返回参数数量(不包括仅关键字参数,* 或 ** args)。让我们看看使用这些讨论过的属性的这种装饰器的以下实现。
例子:
# Decorator to print function call
# details
def function_details(func):
# Getting the argument names of the
# called function
argnames = func.__code__.co_varnames[:func.__code__.co_argcount]
# Getting the Function name of the
# called function
fname = func.__name__
def inner_func(*args, **kwargs):
print(fname, "(", end = "")
# printing the function arguments
print(', '.join( '% s = % r' % entry
for entry in zip(argnames, args[:len(argnames)])), end = ", ")
# Printing the variable length Arguments
print("args =", list(args[len(argnames):]), end = ", ")
# Printing the variable length keyword
# arguments
print("kwargs =", kwargs, end = "")
print(")")
return inner_func
# Driver Code
@function_details
def GFG(a, b = 1, *args, **kwargs):
pass
GFG(1, 2, 3, 4, 5, d = 6, g = 12.9)
GFG(1, 2, 3)
GFG(1, 2, d = 'Geeks')
输出:
GFG (a = 1, b = 2, args = [3, 4, 5], kwargs = {‘d’: 6, ‘g’: 12.9})
GFG (a = 1, b = 2, args = [3], kwargs = {})
GFG (a = 1, b = 2, args = [], kwargs = {‘d’: ‘Geeks’})