2016-11-28 2 views
1

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

Я написал следующий код, чтобы проверить простую функцию обратного вызова.

def callback(a, b): 
    print('Sum = {0}'.format(a+b)) 

def main(callback=None): 
    print('Add any two digits.') 
    if callback != None: 
     callback 

main(callback(1, 2)) 

Я получаю это когда я исполняю его:

Sum = 3 
Add any two digits. 

Add any two digits Почему после Sum = 3? Я предполагаю, что это происходит потому, что функция обратного вызова выполняется в первую очередь. Как выполнить функцию обратного вызова после выполнения всего остального кода в main()?

ответ

9

callback сама по себе ничего не делает. Он принимает параметры.

Тот факт, что вы сделали callback(1, 2), сначала назовет эту функцию, тем самым распечатав Sum = 3.

С callback возвращает не явное значение, оно возвращается как None, так что ваш код эквивалентен

callback(1, 2) 
main() 

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

def callback(sum): 
    print("Sum = {}".format(sum)) 

def main(a, b, callback = None): 
    print("adding {} + {}".format(a, b)) 
    if callback: 
     callback(a+b) 

main(1, 2, callback) 
+0

Хорошая идея передать два аргумента перед вызовом назад, чтобы заставить переводчика сделать для вас какую-то работу! – erip

+1

@erip Как вы это понимаете? Как ваш ответ? –

+0

Я имею в виду твою - хорошая идея. :) Заставляя пользователя передавать аргументы до того, как обратный вызов гарантирует, что они существуют, есть ошибка, вызывающая 'main'. – erip

3

Как указано в комментариях, ваш обратный вызов вызывается всякий раз, когда он суффикс с открытыми и закрытыми параметрами; поэтому его называют, когда вы его передаете.

Возможно, вы захотите использовать лямбда и передать значения.

#!/usr/bin/env python3 

def main(callback=None, x=None, y=None): 
    print('Add any two digits.') 
    if callback != None and x != None and y != None: 
     print("Result of callback is {0}".format(callback(x,y))) 
    else: 
     print("Missing values...") 

if __name__ == "__main__": 
    main(lambda x, y: x+y, 1, 2) 
0

Проблема в том, что вы оцениваете обратный вызов, прежде чем передавать его в качестве вызываемого. Один гибкий способ решить эту проблему:

def callback1(a, b): 
    print('Sum = {0}'.format(a+b)) 

def callback2(a): 
    print('Square = {0}'.format(a**2)) 

def callback3(): 
    print('Hello, world!') 

def main(callback=None, cargs=()): 
    print('Calling callback.') 
    if callback != None: 
     callback(*cargs) 

main(callback1, cargs=(1, 2)) 
main(callback2, cargs=(2,)) 
main(callback3) 

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

0

Вот что вы хотите сделать:

def callback(a, b): 
    print('Sum = {0}'.format(a+b)) 

def main(a,b,f=None): 
    print('Add any two digits.') 
    if f != None: 
     f(a,b) 

main(1, 2, callback) 
0

Ваш код выполняется следующим образом:

main(callback(1, 2)) 

callback функция вызывается с (1, 2) и возвращает None (без оператора возврата, ваша функция печатает Sum = 3 и возвращает None)

main функция вызывается с None в качестве аргумента (So callback != None всегда будет False)

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