Articles of decorator

Compruebe si una función tiene un decorador

Mi pregunta es general, pero específicamente mi aplicación es el decorador requerido para iniciar sesión para Django. Tengo curiosidad por saber si hay una manera de verificar si una vista / función tiene un decorador específico (en este caso, el decorador login_required) Estoy redireccionando después de cerrar la sesión de un usuario, y quiero redirigir […]

¿Por qué inspeccionar devuelve una línea diferente para la clase heredada de la superclase?

Al tratar de averiguar si una función se llama con la syntax de @decorator , nos dimos cuenta de que inspect tiene un comportamiento diferente cuando se mira una clase decorada que se hereda de una superclase. El siguiente comportamiento se encontró con CPython 3.6.2 en Windows 10. También se reprodujo en CPython 3.7.0 bajo […]

Función de inyección de llamada después de __init__ con decorador

Estoy tratando de encontrar la mejor manera de crear un decorador de clase que haga lo siguiente: Inyecta algunas funciones en la clase decorada. Fuerza una llamada a una de estas funciones DESPUÉS de que se llame la clase decorada ‘ __init__ Actualmente, solo estoy guardando una referencia al método ‘original’ __init__ y reemplazándolo con […]

Uso de métodos de clase / estáticos como valores de parámetros predeterminados dentro de métodos de la misma clase

Me gustaría hacer algo como esto: class SillyWalk(object): @staticmethod def is_silly_enough(walk): return (False, “It’s never silly enough”) def walk(self, appraisal_method=is_silly_enough): self.do_stuff() (was_good_enough, reason) = appraisal_method(self) if not was_good_enough: self.execute_self_modifying_code(reason) return appraisal_method def do_stuff(self): pass def execute_self_modifying_code(self, problem): from __future__ import deepjuju deepjuju.kiss_booboo_better(self, problem) Con la idea de que alguien puede hacer. >>> silly_walk = SillyWalk() […]

¿Cómo uso el paquete python-decorator para decorar los métodos de clase?

Tengo un decorador que quiero usar para decorar los métodos de clase. En el siguiente ejemplo, el decorador @mydec funciona bien por sí solo, sin embargo, no conserva la firma de la función cuando se utiliza help () o pydoc. Para solucionar esto, observé el uso del paquete @decorator python-decorator: import functools import decorator @decorator.decorator […]

Los decoradores de Python que forman parte de una clase base no se pueden usar para decorar funciones miembro en clases heredadas

Los decoradores de Python son divertidos de usar, pero parece que he golpeado una pared debido a la forma en que se pasan los argumentos a los decoradores. Aquí tengo un decorador definido como parte de una clase base (el decorador accederá a los miembros de la clase, por lo tanto, requerirá el parámetro propio). […]

Recuperación del generador mediante decorador.

Tengamos una clase que tenga una función que falle de vez en cuando, pero después de algunas acciones simplemente funciona perfectamente. El ejemplo de la vida real sería Mysql Query, que genera _mysql_exceptions.OperationalError: (2006, ‘MySQL server has gone away’) pero después de la reconexión del cliente funciona bien. He intentado escribir decorador para esto: def […]

¿Cómo se puede adjuntar un decorador a una función “después del hecho” en python?

La forma en que entiendo a los decoradores de la función en python (y podría estar equivocado), es que se supone que agregan efectos secundarios y modifican el valor de retorno de una función. Ahora los decoradores se agregan por encima de la definición de la función de la función a decorar o por una […]

Detecta eventos de “llamada de función anterior / posterior” para todas las funciones en clase

¿Hay alguna posibilidad de capturar eventos de “llamada de función anterior / posterior” para todas las funciones en clase, sin decorar cada una de estas funciones? ¿Puede haber algún decorador de clase? En otras palabras, para dicho código, me gustaría obtener el siguiente resultado: class Foo: def func1(): print(‘1’) def func2(): print(‘2’) c = Foo() […]

Cómo registrar automáticamente una clase cuando está definida

Quiero tener una instancia de clase registrada cuando se define la clase. Lo ideal sería que el siguiente código hiciera el truco. registry = {} def register( cls ): registry[cls.__name__] = cls() #problem here return cls @register class MyClass( Base ): def __init__(self): super( MyClass, self ).__init__() Desafortunadamente, este código genera el error NameError: global […]