Как использовать функцию обратного вызова в 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():
Чтобы выполнить свою задачу.