【问题标题】:How can I create chain of callbacks in python?如何在 python 中创建回调链?
【发布时间】:2013-11-29 16:19:54
【问题描述】:

在 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 中做同样的事情?

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

【问题讨论】:

  • 使用 lambda 语句,或者传递函数对象。
  • 很好奇,我认为没有“lambda 语句”之类的东西——我知道 lambda 表达式。但果然是appears in the official Python docs这句话。撇开迂腐不谈,lambda 表达式的“主体”确实是简单的表达式。它们不是可以以 OP 想要的方式保持状态的语句。可能有一些技巧可以让它们这样做,但总的来说最好避免使用它们。

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


【解决方案1】:

将函数作为参数传递。

some = 100

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

param1 = 1
func1(param1, callback1)

【讨论】:

    【解决方案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']
    

    【讨论】:

      【解决方案3】:

      函数是 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)
      

      【讨论】:

        【解决方案4】:

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

        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
        

        【讨论】:

          猜你喜欢
          • 2019-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-07
          • 1970-01-01
          • 2019-09-20
          相关资源
          最近更新 更多