Desidero che diverse funzioni siano eseguibili solo se l'utente che ha effettuato l'accesso ha il livello di autorizzazione richiesto.decoratore per impostare gli attributi della funzione
Per rendere la mia vita più complessa, semplicemente voglio usare decoratori. Qui di seguito cercherò di impostare l'attributo permission
sulle funzioni "decorate", come mostrato di seguito.
def permission(permission_required):
def wrapper(func):
def inner(*args, **kwargs):
setattr(func, 'permission_required', permission_required)
return func(*args, **kwargs)
return inner
return wrapper
@permission('user')
def do_x(arg1, arg2):
...
@permission('admin')
def do_y(arg1, arg2):
...
Ma quando lo faccio:
fn = do_x
if logged_in_user.access_level == fn.permission_required:
...
ottengo un errore 'function' object has no attribute 'permission_required'
Che cosa mi manca?
Come nota a margine: sono abbastanza sicuro che si desidera utilizzare [ 'functools.wraps'] (http://docs.python.org/2/library/functools.html#functools.wraps) Qui. Non per risolvere direttamente il tuo problema, ma perché è quasi impossibile eseguire il debug di questo tipo di codice quando tutte le funzioni finiscono con il nome 'inner', prendendo' (* args, ** kwargs) ',' inspect'ing alla fonte sbagliata, ecc. – abarnert