如何在python中创建回调链?

时间:2013-11-16 05:45:18

标签: python python-3.x asynchronous callback closures

在javascript中,我可以执行以下操作:

var some = 100;

var param1 = 1;
func1(param1, function(res1) {

    var param2 = res1 + some;
    func2(param2, function(res2) {
        // ...
    });
});

在php中:

$some = 100;

$param1 = 1;
func1($param1, function($res1) use ($some) {

    $param2 = $res1 + $some;
    func2($param2, function($res2) {
        // ...
    });
});

我怎样才能在python中做同样的事情?

...............................................

4 个答案:

答案 0 :(得分:3)

将函数作为参数传递。

some = 100

def callback1(res1):
    param2 = res1 + some
    func2(param2, callback2)
def callback2(res2):
    ...

param1 = 1
func1(param1, callback1)

答案 1 :(得分:2)

我看到你也标记了asynchronous。 Python不是asynchronous。但是python函数也是javascript和php之类的第一类对象。所以,你也可以在python中做同样的事情。

def func1(data, nextFunction = None):
    print data
    if nextFunction:
        nextFunction()

def func(data, nextFunction = None):
    print data
    nextFunction(data * 10)

func(1, func1)

<强>输出

1
10

内联函数定义在python中受到限制,但仍可以使用lambda函数。例如,

data = ["abcd", "abc", "ab", "a"]
print sorted(data, key = lambda x: len(x)) # Succinctly written as key = len

<强>输出

['a', 'ab', 'abc', 'abcd']

答案 2 :(得分:1)

函数是Python中的第一类对象,您也可以嵌套它们。

EG:

#!/usr/local/cpython-3.3/bin/python

some = 100

param1 = 1

def func1(param1, function):
    param2 = res1 + some;
    def func2(param2, function):
        pass
    func2(param2, function)

答案 3 :(得分:1)

装饰器只是“可以在另一个函数之前和之后执行任意代码的东西”的语法包装。这就是你用回调做的事情,嘿:flat比嵌套要好。

def func1(fn):
    def wrapped(arg):
        return fn(arg+1)
    return wrapped

def func2(fn):
    def wrapped(arg):
        return fn(arg+2)
    return wrapped

@func1
@func2
def func3(x):
    return x + 3

print(func3(1))
#prints 7