15

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

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

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

Интересно, если обратный вызов выполняется или нет, если я пишу кусок кода, как это:

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

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), но оба они ошибочны, поскольку их необходимо выполнить.

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

+0

Пытался выполнить? – specialscope

ответ

14

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

CherryPy's 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, чтобы иметь двойной ()(), но если вы подумаете об этом какое-то время, это имеет смысл.

3

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

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

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

Чтобы сделать вашу задачу.

Смежные вопросы