Как использовать функцию обратного вызова в python?

Интересно, как правильно использовать функции обратного вызова python 2.7.

У меня есть некоторые функции обратного вызова из примеров Cherrypy auth в моем коде.

(Эти обратные вызовы возвращают функцию, которая может оценивать значение True или False, в зависимости от зарегистрированного пользователя, находящегося в группе или нет.)

Интересно, выполняется ли обратный вызов или нет, если я напишу фрагмент кода следующим образом:

Учитывая определение из библиотеки:

def member_of(groupname):
    def check():
        if groupname == 'admin':
          if cherrypy.request.login == 'joe':
            return True
          if cherrypy.request.login == 'toni':
            return True
          return False
        return False
        # .... (other groups checked in the same way)
    return check # returns a callback function from my understanding?

Как я могу применить и выполнить обратный вызов в моем коде?

Если я так выразился:

 if member_of('admin'):
    do_something()
  else:
    do_something_else()

Будет ли это выполнять calllback и проверять группу администратора? Или он выяснит, является ли значение "member_of" определением функции, а определение функции, вероятно, всегда является "истинным" значением (или, возможно, значением False), но оба являются неправильными, поскольку его необходимо выполнить

Можете ли вы просветить меня по этому поводу? Как я могу убедиться, что обратный вызов выполнен? Как я могу передать это, как есть?

Ответы

Ответ 1

В python, как и во многих других языках, переменная может также содержать функцию, и вы можете передавать ее, как и другие переменные, которые содержат, например, числа или строки.

Функция CherryPy member_of сама возвращает функцию в вашем примере.

Я объясняю это простыми шагами:

Если вы пишете member_of(), он возвращает результат функции member_of(), которая в этом случае является функцией с именем check.

cb_function = member_of('admin')

В этот момент переменная cb_function содержит результат вызова функции member_of, а в последней строке member_of возвращает check, которая была определена в функции member_of как другая функция!

Вы должны снова вызвать первый результат, потому что можете и вы должны обрабатывать его почти так же, как локальная функция, которую вы определили в текущем контексте, чтобы получить окончательный результат, выполнив что-то вроде:

my_result =  cb_function()

И тогда вы будете продолжать и использовать результат. Например, вы можете проверить его логическое значение:

if my_result:
  # do something
  ...   

3 шага сверху вместе могут быть записаны короче:

cb_function = member_of('admin')
  if cb_function():
    # do something
    ...

Или даже короче:

if member_of('admin')():
  # do something
  ...  

Вначале может показаться немного странным в python, чтобы иметь двойной ()(), но если вы думаете об этом какое-то время, это имеет смысл.

Ответ 2

Если вы его выполнили, это просто.

member_of() вернет проверку объекта метода. вы должны выполнить, чтобы получить результат, выполнив что-то вроде if member_of('admin')(): или,

k=member_of('admin')
if k():

Чтобы выполнить свою задачу.