Obtener firma de función
-
Use
firma ()
para obtener detalles de llamadas a funciones en Python - Use decoradores para obtener detalles de llamadas de función en Python
Este tutorial discutirá un par de métodos para obtener detalles de llamadas a funciones rápidamente usando Python. Esto es particularmente útil cuando se analiza una gran base de código y resulta difícil averiguar qué está haciendo una función de un vistazo.
En lugar de ir y venir a través del código, tenemos soluciones más inteligentes para este problema exacto utilizando funciones y decoradores signature()
.
Use firma ()
para obtener detalles de llamadas a funciones en Python
La forma más fácil de obtener esta información es usando la función inspect.signature()
. El documento para Python 3.5+ recomienda usar esta función.
inspect.signature()
acepta una variedad de invocables. Esto incluye funciones, clases y objetos functools.partial()
.
La función devuelve la anotación del invocable. Si no se puede proporcionar una firma, la función genera un ValueError
; si el tipo de objeto no es compatible, genera un TypeError
.
Código de ejemplo:
import inspect
def foo(x, y, a="anything"):
pass
print(inspect.signature(foo))
Debería imprimir lo siguiente en su terminal.
(x, y, a="anything")
Use decoradores para obtener detalles de llamadas de función en Python
Las funciones en Python tienen algunos atributos que podemos usar. Entre estos atributos se encuentra __code__
.
El atributo __code__
tiene además atributos que podemos usar. A continuación, puede encontrar cada uno de ellos enumerados, explicando lo que hacen.
Debajo de eso, incluiremos un fragmento de código para escribir su función que puede realizar esta tarea. Usamos el atributo __name__
para obtener el nombre de la función.
-
co_varnames
devuelve una tupla de los nombres de los argumentos pasados a la función y las variables locales utilizadas dentro de la función. -
co_argcount
devuelve el número de argumentos. Sin embargo, este recuento excluye los argumentos de solo palabras clave (kwargs
),*args
y**args
.Hemos incluido una forma de imprimir todos estos argumentos en nuestro fragmento.
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