Коллбэки

Функции и переменные

Функция — это объект. Такой же, как числа или строки. И так же, как числа или строки, их можно складывать в переменные.

Рассмотрим пример - возьмём встроенную функцию len(), которая считает длину переданного ей аргумента:

a = len('Привет!')
b = len
print(a)  # 7
print(b)  # <built-in function len>

В первом случае мы вызывали (читай, запустили) функцию len, передали ей строку и получили результат её работы: 7. Его мы и записали в переменную a.

Во втором случае функцию не вызывали, а сразу же записали в переменную. Теперь в b лежит len. Мы даже можем вызывать её оттуда:

b('Привет!')  # 7

Получается, что если не вызывать функцию (не использовать круглые скобки), то ей можно оперировать как любым другим типом данных, как числом или строкой. А если функцию можно записывать в переменные, значит её можно передать аргументом на вход другой функции. Вот мы и добрались до коллбэков.

Что такое коллбэк

Коллбэк — это функция, которая передаётся на вход другой функции (или другому участку кода), чтобы её запустили в ответ на какое-то событие. С помощью этого приёма работают чатботы и интерактивные веб-странички: пользователь нажимает на кнопку, его действие генерирует событие и на событие реагирует коллбек (функция-обработчик). Рассмотрим пример:

python3
from time import time_ns

def timeit(function):
    start_time = time_ns()
    function()
    end_time = time_ns()
    return end_time - start_time

timeit(print)  # 28278 наносекунд

Функция timeit принимает на вход любую другую функцию и засекает время её выполнения. Функция time_ns() засекает текущее время.

Как вызвать коллбэк

Коллбэк вызывается так же, как и обычная функция:

def callback_function():
    print("Я коллбэк")

callback = callback_fuction

callback()

Мы положили функцию в переменную, а потом вызвали её, поставив скобки. На экран вывелось "Я коллбэк".

Создадим список из коллбэков:

def callback_1():
    print("Я первый коллбэк")

def callback_2():
    print("Я второй коллбэк")

def callback_3():
    print("Я третий коллбэк")

callbacks = [callback_1, callback_2, callback_3]  # Обратите внимание, что скобок нет.
# Мне нужны не результаты вызова функций, а сами функции

for callback in callbacks:
    callback()  # а вот здесь я уже вызываю функции

На экран выведутся все 3 надписи по порядку:

Я первый коллбэк
Я второй коллбэк
Я третий коллбэк