Можно ли получить значения вызываемой функции во время выполнения?

#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 -это одна строка кода, которая не смешивается с остальной частью кода и сохраняет шаблонность.