Das Problem ist, dass Sie Ihren request_cacher
Dekorateur als Dekorator mit Argumenten definiert haben, aber Sie haben vergessen, das Argument zu übergeben!
Betrachten Sie diesen Code:
import functools
def my_decorator_with_argument(useless_and_wrong):
def wrapper(func):
@functools.wraps(func)
def wrapped(self):
print('wrapped!')
return wrapped
return wrapper
class MyClass(object):
@my_decorator_with_argument
def method(self):
print('method')
@my_decorator_with_argument(None)
def method2(self):
print('method2')
Wenn Sie versuchen, method
in einer Instanz zu verwenden, erhalten Sie:
>>> inst = MyClass()
>>> inst.method # should be the wrapped function, not wrapper!
<bound method MyClass.wrapper of <bad_decorator.MyClass object at 0x7fed32dc6f50>>
>>> inst.method()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "bad_decorator.py", line 6, in wrapper
@functools.wraps(func)
File "/usr/lib/python2.7/functools.py", line 33, in update_wrapper
setattr(wrapper, attr, getattr(wrapped, attr))
AttributeError: 'MyClass' object has no attribute '__name__'
Mit der korrekten Verwendung des Dekorateur:
>>> inst.method2()
wrapped!
Alternative Fix ist eine Schicht vom Dekorateur entfernen:
def my_simpler_decorator(func):
@functools.wraps(func)
def wrapped(self):
print('wrapped!')
return wrapped
class MyClass(object):
@my_simpler_decorator
def method3(self):
print('method3')
Und man kann sehen, dass es den Fehler nicht erhöhen:
>>> inst = MyClass()
>>> inst.method3()
wrapped!
Sie erkennen, dass Sie die '@ asynchronous' anwenden und' @ coroutine' Dekorateure zweimal? – holdenweb
ja, das tue ich. dieser Cache aufrufbar muss auch asynchron arbeiten – tunaktunak
Bitte buchen Sie die vollständige Traceback, nicht nur die Ausnahme. –