Obtener firma de función

Muhammad Husnain 21 junio 2023
  1. Use firma () para obtener detalles de llamadas a funciones en Python
  2. Use decoradores para obtener detalles de llamadas de función en Python
Obtener firma de función

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.

  1. 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.

  2. 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
Muhammad Husnain avatar Muhammad Husnain avatar

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

Artículo relacionado - Python Function