Python - Librería Functools
##############################################################
#Ejemplos en Python usando la librería functools.
#1. Utilizar `partial` para crear una función con argumentos predefinidos:
import functools
# define una función con dos argumentos
def suma(a, b):
return a + b
# utiliza partial para crear una nueva función con el argumento 'a' predefinido como 5
suma_con_5 = functools.partial(suma, a=5)
# llama a la función con el argumento 'b' específico (3)
resultado = suma_con_5(b=3)
# imprime el resultado (8)
print(resultado)
#2. Utilizar `reduce` para aplicar una función a todos los elementos de una lista:
import functools
# define una lista de números
numeros = [1, 2, 3, 4, 5]
# utiliza reduce para sumar todos los números en la lista
suma_total = functools.reduce(lambda x, y: x + y, numeros)
# imprime la suma total (15)
print(suma_total)
#3. Utilizar `cached_property` para cachear el resultado de un método:
import functools
# define una clase con un método costoso en términos de procesamiento
class Ejemplo:
@functools.cached_property
def resultado_costoso(self):
# realiza algún procesamiento costoso aquí
return 42
# crea una instancia de la clase y llama al método varias veces
ejemplo = Ejemplo()
print(ejemplo.resultado_costoso)
print(ejemplo.resultado_costoso)
print(ejemplo.resultado_costoso)
#4. Utilizar `wraps` para decorar una función sin perder su información original:
import functools
# define una función decoradora que imprime un mensaje antes y después de la función decorada
def mi_decorador(funcion):
@functools.wraps(funcion)
def wrapper(*args, **kwargs):
print('Antes de la función')
resultado = funcion(*args, **kwargs)
print('Después de la función')
return resultado
return wrapper
# define una función que será decorada
@mi_decorador
def mi_funcion():
print('En la función')
# llama a la función decorada
mi_funcion()
#5. Utilizar `total_ordering` para definir los métodos de comparación en una clase:
import functools
# utiliza total_ordering para definir los métodos de comparación en la clase
@functools.total_ordering
class MiClase:
def __init__(self, valor):
self.valor = valor
def __eq__(self, otro):
return self.valor == otro.valor
def __lt__(self, otro):
return self.valor < otro.valor
# crea dos instancias de la clase y compáralas
instancia1 = MiClase(1)
instancia2 = MiClase(2)
print(instancia1 == instancia2)
print(instancia1 < instancia2)