es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.")
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Problema con la función “anonimize” como decorador

    El código proporcionado define una clase llamada BankApplication que contiene un método llamado anonimize 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 clase BankApplication se define como un método de instancia, que espera que se pase el argumento self 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:

    import re
    
    
    class BankApplication:
    
        def __init__(self, bank_name):
            self.name = bank_name
    
        @staticmethod
        def anonymize(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
    
        @anonymize
        def feedback(self, feedback_text):
            print("Llamada a feedback")
    
        @anonymize
        def log_info(self, info_to_log):
            print("Llamada a log_info")
    
    
    bank = BankApplication("Bank")
    bank.feedback("Nombre: John Doe\nCorreo electrónico: johndoe@fakemail.com\nNúmero de cuenta: 911911911.")
    

    Espero que esta explicación ayude a entender el problema y la solución.

Comments are closed.