Зачастую, в декораторе необходимо получить один из аргументов декорируемой функции, например, для проверки. Не всегда мы знаем является ли искомый параметр позиционным аргументом или аргументом ключевого слова. Конечно мы можем это проверить, а можем воспользоваться функцией inspect.getcallargs(), она вернет словарь, с именами аргументов и их значениями в виде пар ключ/значение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import functools from inspect import getcallargs def is_admin(f): @functools.wrap(f) def wrapper(*args, **kwargs): func_args = getcallargs(f, *args, **kwargs) if func_args.get('role') != 'admin': raise Exception('Something') return f(*args, **kwargs) return wrapper @is_admin def some_action(role, name='John Doe'): pass |
Легко и просто.