Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 扭曲延迟链_Python_Twisted_Deferred - Fatal编程技术网

Python 扭曲延迟链

Python 扭曲延迟链,python,twisted,deferred,Python,Twisted,Deferred,我有一个异步管理模块调用的应用程序: 它请求一个自身触发的延迟 附加自定义回调 检查返回的代码,查看是否继续,否则处理错误 这是返回延迟到主应用程序的代码: def xxfi_connect(self, hostname): d = defer.Deferred() d.callback(Milter.ReturnCodes.CONTINUE) return d 要异步附加一些代码,我需要在延迟函数中连接我的函数调用,如下所示: d = defer.Deferred

我有一个异步管理模块调用的应用程序:

  • 它请求一个自身触发的延迟
  • 附加自定义回调
  • 检查返回的代码,查看是否继续,否则处理错误
这是返回延迟到主应用程序的代码:

def xxfi_connect(self, hostname):
    d = defer.Deferred()
    d.callback(Milter.ReturnCodes.CONTINUE)
    return d
要异步附加一些代码,我需要在延迟函数中连接我的函数调用,如下所示:

d = defer.Deferred()
d.addCallback(self.run_mods, application.L_CONNECT)
d.callback(Milter.ReturnCodes.CONTINUE)
def run_mods(self, level):
    pass
问题在于,每个连接的函数都会收到一个包含回调参数的参数(application.L\u CONNECT)

是否可以在每次函数调用中不传输返回代码的情况下实现这一点

理想情况下,我希望我的回调函数如下所示:

d = defer.Deferred()
d.addCallback(self.run_mods, application.L_CONNECT)
d.callback(Milter.ReturnCodes.CONTINUE)
def run_mods(self, level):
    pass
而不是

def run_mods(self, code, level):
    pass

因为
code
(Milter.ReturnCodes.CONTINUE)只在链的末尾需要

区分成功或错误的
延迟()

>>> from twisted.internet import defer
>>> d = defer.Deferred()
>>> def errors(*args): raise Exception("i'm a bad function")
>>> def sad(*arg): print "this is not so good", arg
>>> def happy(*arg): print "this is good", arg
>>> d.addCallback(errors)
<Deferred at 0x106821f38>
>>> d.addCallbacks(happy, sad)
<Deferred at 0x106821f38>
>>> d.callback("hope")
this is not so good (<twisted.python.failure.Failure <type 'exceptions.Exception'>>,)
来自twisted.internet的
>>
>>>d=延迟。延迟()
>>>def错误(*args):引发异常(“我是一个坏函数”)
>>>def sad(*arg):打印“这不太好”,arg
>>>def happy(*arg):打印“这很好”,arg
>>>d.addCallback(错误)
>>>d.addCallbacks(快乐、悲伤)
>>>d.回调(“希望”)
这不太好(,)
回调链中的任何给定“阶段”都可以很容易地知道它是否遵循错误状态,无论是通过它是如何添加的,作为
adderback()
的参数,还是
addCallbacks()
的第二个参数,还是由于它的参数是
Failure()的实例,都可以知道它是否遵循错误状态


有关延迟链接的更多信息,请参阅:

谢谢,这确实是我可以做的,但如果更一般地说,我延迟链接2,并且不希望将顶部链接的结果发送给子链接,该怎么办?这可能吗?您可以插入回调函数来丢弃一些参数,例如:
d.addCallback(lambda,b:b)