Chcę, aby różne funkcje były wykonywane tylko wtedy, gdy zalogowany użytkownik ma wymagany poziom uprawnień.Dekorator do ustawiania atrybutów funkcji
Aby moje życie było bardziej złożone, po prostu chcę użyć dekoratorów. Poniżej uwidoczniam ustawienie atrybutu permission
dla funkcji "dekorowanych" - jak pokazano poniżej.
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):
...
Ale kiedy zrobić:
fn = do_x
if logged_in_user.access_level == fn.permission_required:
...
otrzymuję błąd 'function' object has no attribute 'permission_required'
Czego mi brakuje?
na marginesie: Jestem całkiem pewien, że chcesz używać [ 'functools.wraps'] (http://docs.python.org/2/library/functools.html#functools.wraps) tutaj. Nie po to, by rozwiązać problem bezpośrednio, ale dlatego, że debugowanie tego rodzaju kodu jest niemożliwe, gdy wszystkie funkcje kończą się na nazwie "wewnętrzna", biorąc "(* args, ** kwargs)', 'sprawdzając' niewłaściwe źródło, itd. – abarnert