Ho cercato di creare un decoratore che possa essere utilizzato con entrambe le funzioni e i metodi in python. Questo da solo non è difficile, ma quando si crea un decoratore che prende argomenti, sembra che lo sia.Utilizzo dello stesso decoratore (con argomenti) con funzioni e metodi
class methods(object):
def __init__(self, *_methods):
self.methods = _methods
def __call__(self, func):
def inner(request, *args, **kwargs):
print request
return func(request, *args, **kwargs)
return inner
def __get__(self, obj, type=None):
if obj is None:
return self
new_func = self.func.__get__(obj, type)
return self.__class__(new_func)
Il codice sopra avvolge la funzione/metodo corretto, ma nel caso di un metodo, l'argomento request
è l'istanza è operativo su, non il primo argomento non-self.
C'è un modo per dire se il decoratore viene applicato a una funzione anziché a un metodo e si occupa di conseguenza?
Si dovrebbe aggiungere 'update_wrapper (self, func)' al * inizio * di '_MethodDecoratorAdaptor .__ init__' (dove update_wrapper è dal divertimento modulo ctools). Questo fa sì che i decoratori risultanti conservino gli attributi personalizzati sulle funzioni/callebles che decorano, mantenendoli anche componibili. – spookylukey
Ho scoperto che questo metodo funziona solo in alcune circostanze ed è estremamente difficile eseguire il debug quando non funziona. http://groups.google.com/group/django-developers/msg/f36976f5cfbcbeb3 – spookylukey
@spookylukey In realtà il modo in cui questo viene gestito in Django è abbastanza pulito. – astrojuanlu