Python – Obtener la firma de la función

Consideremos un escenario en el que ha escrito un código muy extenso y desea conocer los detalles de la llamada a la función. Entonces, lo que puede hacer es desplazarse por su código todas y cada una de las diferentes funciones para conocer sus detalles o puede trabajar de manera inteligente. Puede crear un código donde puede obtener los detalles de la función sin desplazarse por el código. Esto puede lograrse de dos formas –

  • Usando la función de firma()
  • Usando decoradores

Usando la función de firma()

Podemos obtener la función Signature con la ayuda de la función signature() . Toma callable como parámetro y devuelve la anotación. Lanza un valor Error si no se proporciona una firma. Si se proporciona el objeto de tipo no válido, arroja un error de tipo.

Sintaxis:

inspect.signature(callable, *, follow_wrapped=True)

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

Producción

(x:str, y:int)
x:str
<class 'int'>

Uso de decoradores

Para ello las funciones en Python tienen ciertos atributos. Uno de esos atributos es __code__ que devuelve el bytecode de la función llamada. Los atributos __code__ también tienen ciertos atributos que nos ayudarán en la realización de nuestras tareas. Usaremos el atributo co_varnames que devuelve la tupla de nombres de argumentos y variables locales y co_argcount que devuelve el número de argumentos (sin incluir argumentos de solo palabras clave, * o ** args). Veamos la implementación a continuación de dicho decorador usando estos atributos discutidos.

Ejemplo:

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

Producción:

GFG (a = 1, b = 2, argumentos = [3, 4, 5], kwargs = {‘d’: 6, ‘g’: 12.9})
GFG (a = 1, b = 2, argumentos = [3 ], kwargs = {})
GFG (a = 1, b = 2, args = [], kwargs = {‘d’: ‘Geeks’})

Publicación traducida automáticamente

Artículo escrito por cse1604310056 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *