#python
Вопрос:
Например:
def get_val(n):
return n
def check_args(func):
# gets the arguments of a function at runtime
get_val(1)
get_val(2)
Примечание: Это, вероятно, плохая практика, но я хочу больше понять, как работает python.
Комментарии:
1. Значит, вы просто хотите
check_args
, чтобы вам автоматически звонили приget_val
вызове, без необходимости этого делать вызывающему абоненту?2. Возможно, оберните его декоратором!
Ответ №1:
Декораторы Python позволяют вам делать это с минимальными усилиями:
import functools
def check_args(func):
@functools.wraps(func) # Copies documentation and other stuff from wrapped func to wrapper, making it look as much like the wrapped func as possible
def wrapper(*args, **kwargs):
# do stuff to inspect arguments
return func(*args, **kwargs)
return wrapper
@check_args
def get_val(n):
return n
Использование @check_args
эквивалентно полному определению get_val
, а затем выполнению:
get_val = check_args(get_val)
это означает get_val
, что он заменяется wrapper
функцией, которая теперь вызывается первой, может выполнять проверки, а затем делегировать обернутую функцию (в данном случае get_args
). Очевидно, что только для одной функции это бессмысленно (вы могли бы просто ввести проверку get_val
), но если вы хотите проверить другие функции, добавьте к их определению префикс @check_args
-это одна строка кода, которая не смешивается с остальной частью кода и сохраняет шаблонность.