El decorador de Python se colapsa a pesar de que su código es sólido, no puedo entender por qué.
Así que he escrito una función llamada ‘anonimize’ que recibe una cadena y devuelve esa cadena con algunos detalles enmascarados, usando regex.
La función funciona bien por sí misma, pero intenté convertirla en un decorador y las cosas salieron mal y se bloquearon muchas veces.
Estoy aprendiendo decoradores y realmente me gustaría entender qué estoy haciendo mal.
En esta versión no exitosa, obtuve “TypeError: BankApplication.anonimize() falta 1 argumento posicional requerido: ‘callable'”.
import re
class BankApplication:
def __init__(self, bank_name):
self.name = bank_name
'''
Realiza la anonimización de los datos de texto:
1. Elimina posibles números de cuenta (más de 5 dígitos seguidos)
2. Elimina posibles direcciones de correo electrónico
3. Elimina posibles nombres y apellidos (dos palabras consecutivas comenzando con mayúscula, pero no divididas por un punto)
'''
def anonimize(func):
def inner(arg):
ret = func(arg)
print(
re.sub("[A-Z][a-z]+\s[A-Z][a-z]+", "***", re.sub("\S+@\S+\.\S+", "***", re.sub("\d{5,}", "***", arg))))
return ret
return inner
@anonimize
def feedback(self, feedback_text):
print("Llamada a feedback")
@anonimize
def log_info(self, info_to_log):
print("Llamada a log_info")
bank = BankApplication("Banco")
bank.feedback("Nombre: John Doe\nCorreo electrónico: johndoe@fakemail.com\nNúmero de cuenta: 911911911.")
davy.ai
Problema con la función “anonimize” como decorador
El código proporcionado define una clase llamada
BankApplication
que contiene un método llamadoanonimize
que se supone que funciona como un decorador. El decorador debería recibir una función como parámetro, envolverla con funcionalidad adicional y luego devolver la función envuelta.Sin embargo, el decorador no está funcionando correctamente, lo que causa fallos con el mensaje de error
TypeError: BankApplication.anonimize() falta 1 argumento posicional requerido: 'callable'
.El mensaje de error indica que el decorador no está aceptando correctamente la función y que la función carece de un argumento.
Este problema surge porque la función
anonimize
definida dentro de la claseBankApplication
se define como un método de instancia, que espera que se pase el argumentoself
que representa una instancia de la clase como el primer argumento al llamar al método.En el contexto de usar
anonimize
como una función decoradora, el primer argumento debería ser la función a decorar, no una instancia de la clase.Para solucionar este error, necesitamos cambiar el método
anonimize
para que funcione como un método estático, que no requiere que se pase una instancia de la clase como argumento.Aquí tienes una versión actualizada y corregida del código:
Espero que esta explicación ayude a entender el problema y la solución.