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