Decorador para establecer atributos de función.

Quiero que las diferentes funciones sean ejecutables solo si el usuario conectado tiene el nivel de permiso requerido.

Para hacer mi vida más compleja simplemente quiero usar decoradores. Abajo intento establecer el atributopermission en las funciones "decoradas" - como se muestra a continuación.

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):
    ...

Pero cuando lo hago:

fn = do_x
if logged_in_user.access_level == fn.permission_required:
    ...

Me sale un error'function' object has no attribute 'permission_required'

¿Qué me estoy perdiendo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta