Articles of python decorators

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() […]

¿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 […]

¿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 […]

Functools.update_wrapper () no funciona correctamente

Utilizo Functools.update_wrapper() en mi decorador, pero parece que update_wrapper reescribe solo los atributos de la función (como __doc__ , __name__ ), pero no afecta la función help() . Soy consciente de estas respuestas , pero no funcionan con la clase decoradora. Aquí está mi función. import functools class memoized(object): def __init__(self, func): self.func = func […]

¿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() […]