Articles of python decorators

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

¿Cómo evito el “self.x = x; self.y = y; self.z = z ”patrón en __init__?

Veo patrones como def __init__(self, x, y, z): … self.x = x self.y = y self.z = z … con bastante frecuencia, a menudo con muchos más parámetros. ¿Hay una buena manera de evitar este tipo de repetitividad tediosa? ¿Debe la clase heredar de namedtuple en namedtuple lugar?

Un operador de composición de funciones en Python.

En esta pregunta pregunté acerca de un operador de composición de funciones en Python. @Philip Tzou ofreció el siguiente código, que hace el trabajo. import functools class Composable: def __init__(self, func): self.func = func functools.update_wrapper(self, func) def __matmul__(self, other): return lambda *args, **kw: self.func(other.func(*args, **kw)) def __call__(self, *args, **kw): return self.func(*args, **kw) Agregué las siguientes […]

¿Cómo puedo decorar un método de instancia con una clase de decorador?

Considere este pequeño ejemplo: import datetime as dt class Timed(object): def __init__(self, f): self.func = f def __call__(self, *args, **kwargs): start = dt.datetime.now() ret = self.func(*args, **kwargs) time = dt.datetime.now() – start ret[“time”] = time return ret class Test(object): def __init__(self): super(Test, self).__init__() @Timed def decorated(self, *args, **kwargs): print(self) print(args) print(kwargs) return dict() def call_deco(self): […]

Error del decorador: el objeto NoneType no es invocable

Escribí una función de decorador como esta: def tsfunc(func): def wrappedFunc(): print ‘%s() called’ % func.__name__ return func() return wrappedFunc() @tsfunc def foo(): pass foo() # to get it work, use foo instead of foo() foo() Me llegó el siguiente mensaje de error: foo() called Traceback (most recent call last): File “decorator.py”, line 11, in […]