Уведомления

Группа в Telegram: @pythonsu

#1 Июль 31, 2021 21:17:22

VadimK
Зарегистрирован: 2013-07-03
Сообщения: 199
Репутация: +  16  -
Профиль   Отправить e-mail  

Вызов функции через "двойные" аргументы

Источник

 def close_db(fn):
    """Decorator to be used with tasks that may operate on the database."""
    @wraps(fn)
    def inner(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        finally:
            if not HUEY.immediate:
                close_old_connections()
    return inner
def db_task(*args, **kwargs):
    def decorator(fn):
        ret = task(*args, **kwargs)(close_db(fn))
        ret.call_local = fn
        return ret
    return decorator

Собственно вопрос по конструкции
ret = task(*args, **kwargs)(close_db(fn))
Вызываем функцию task передавая ей аргументы - а потом еще аргументом идет вызов функции. Как понять такую конструкцию , где почитать про такой двойной вызов ?

Офлайн

#2 Июль 31, 2021 21:33:43

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вызов функции через "двойные" аргументы

в питоне всё есть объект. Класс, модуль, функция - это объекты интерпретатора. То есть функция - это равнозначная переменная. У вас етсь функция чей вызов возвращает другую функцию. И уже ту функцию вы и вызываете. Смотрите, есть функция А, она возвращает функцию Б. А = lambda: Б. Но “Б” это тоже функция, то есть вы можете сделать Б() - вызвать её. Уберите лишнее и А()() работает



Отредактировано FishHook (Июль 31, 2021 21:36:21)

Офлайн

#3 Авг. 1, 2021 00:51:28

VadimK
Зарегистрирован: 2013-07-03
Сообщения: 199
Репутация: +  16  -
Профиль   Отправить e-mail  

Вызов функции через "двойные" аргументы

Суть понял, спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version