📜  Python – 获取函数签名

📅  最后修改于: 2022-05-13 01:55:06.989000             🧑  作者: Mango

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') 

输出: