Articles of python decorators

Compruebe si una función utiliza @classmethod

TL; DR ¿Cómo puedo saber si una función se definió usando @classmethod o algo con el mismo efecto? Mi problema Para implementar un decorador de clase me gustaría verificar si un método toma a la clase como su primer argumento, por ejemplo, como se logra a través de @classmethod def function(cls, …): Encontré una solución […]

Cómo usar un administrador de contexto dentro de un decorador y cómo pasar un objeto creado en decorador a función decorada

Tengo una clase de prueba que requiere hacer un poco de limpieza al final. Para asegurarme de que el usuario no se olvide de hacer esto, quiero agregar un administrador de contexto a la clase. También tengo un decorador, dentro del cual quiero usar este administrador de contexto para crear un objeto de clase de […]

Python functools lru_cache con métodos de clase: lanzar objeto

¿Cómo puedo usar functools ‘lru_cache dentro de las clases sin pérdida de memoria? En el siguiente ejemplo mínimo, la instancia foo no se lanzará aunque salga del ámbito y no tenga referencia (aparte de lru_cache). from functools import lru_cache class BigClass: pass class Foo: def __init__(self): self.big = BigClass() @lru_cache(maxsize=16) def cached_method(self, x): return x […]

Decorador Python para cronometrar funciones recursivas.

Tengo un decorador simple para rastrear el tiempo de ejecución de una llamada de función: def timed(f): def caller(*args): start = time.time() res = f(*args) end = time.time() return res, end – start return caller Esto se puede usar de la siguiente manera, y devuelve una tupla del resultado de la función y el tiempo […]

Compruebe si una función fue llamada como decorador

En el siguiente ejemplo mínimo, decorate se llama dos veces. Primero usando @decorate , segundo por función normal call decorate(bar) . def decorate(func): print(func.__name__) return func @decorate def bar(): pass decorate(bar) ¿Es posible ver dentro de decorate si la llamada se invocó usando @decorate o como una llamada de función normal?

No se puede llamar a un decorador dentro de la subclase importada de una aplicación cherrpy (árbol de sitio)

Estoy utilizando cherrypy como servidor web y quiero verificar el estado de inicio de sesión de un usuario antes de devolver la página. Esto funciona con los métodos en la clase de aplicación principal (en site.py ) pero da un error cuando llamo a la misma función decorada en el método en una clase que […]

Implementando una propiedad de clase que preserva la cadena de documentos.

Tengo un descriptor que convierte un método en una propiedad en el nivel de clase: class classproperty(object): def __init__(self, getter): self.getter = getter self.__doc__ = getter.__doc__ def __get__(self, instance, owner): return self.getter(owner) Utilizado de esta manera: class A(object): @classproperty def test(cls): “docstring” return “Test” Sin embargo, ahora no puedo acceder al atributo __doc__ (lo cual […]

Python establece la cadena de documentación y obtiene el nombre del método del método de clase generado dinámicamente

Intento obtener / establecer el nombre y la cadena de documentación de los métodos de clase creados dinámicamente de la siguiente manera, pero tengo problemas para averiguar exactamente cómo hacerlo: import sys import inspect class test(object): pass @classmethod def genericFunc(cls, **kwargs): print “function:”, (inspect.stack()[0][3]) print “kwargs:”, kwargs function_list = [‘myF1’, ‘myF2’] for func in function_list: […]

Ámbito de variables en el decorador python.

Tengo un problema muy raro en un decorador de Python 3. Si hago esto: def rounds(nr_of_rounds): def wrapper(func): @wraps(func) def inner(*args, **kwargs): return nr_of_rounds return inner return wrapper funciona bien Sin embargo, si hago esto: def rounds(nr_of_rounds): def wrapper(func): @wraps(func) def inner(*args, **kwargs): lst = [] while nr_of_rounds > 0: lst.append(func(*args, **kwargs)) nr_of_rounds -= 1 […]

¿Cómo obtener el código fuente de la función que está envuelto por un decorador?

Quería imprimir el código fuente de my_func , que está envuelto por my_decorator : import inspect from functools import wraps def my_decorator(some_function): @wraps(some_function) def wrapper(): some_function() return wrapper @my_decorator def my_func(): print “supposed to return this instead!” return print inspect.getsource(my_func) Sin embargo, devuelve la fuente para el contenedor en su lugar: @wraps(some_function) def wrapper(): some_function() […]