也许您正在寻找的是twisted.internet.defer.gatherResults
:
d = gatherResults([calc(a), calc2(b), calc3(c)])
def calculated((j, i, f)):
if s:
return combine(i, j, f)
d.addCallback(calculated)
但是,这仍然存在s
未定义的问题。我不太清楚你期望如何s
定义。如果它是 中的局部变量calc3
,那么您需要返回它以便调用者可以使用它。
也许 calc3 看起来像这样:
def calc3(argument):
s = bool(argument % 2)
return argument + 1
所以,相反,考虑让它看起来像这样:
Calc3Result = namedtuple("Calc3Result", "condition value")
def calc3(argument):
s = bool(argument % 2)
return Calc3Result(s, argument + 1)
现在您可以重写调用代码,使其真正起作用:
有点不清楚你在这里问什么。听起来你知道什么是回调,但如果是这样,那么你应该能够自己得出这个答案:
d = gatherResults([calc(a), calc2(b), calc3(c)])
def calculated((j, i, calc3result)):
if calc3result.condition:
return combine(i, j, calc3result.value)
d.addCallback(calculated)
或者,根据您在下面的评论,可能calc3
看起来更像这样(这是我要做的最后一个猜测,如果它是错误的并且您想要更多输入,那么请实际分享的定义calc3
):
def _calc3Result(result, argument):
if result == "250":
# SMTP Success response, yay
return Calc3Result(True, argument)
# Anything else is bad
return Calc3Result(False, argument)
def calc3(argument):
d = emailObserver("The argument was %s" % (argument,))
d.addCallback(_calc3Result)
return d
幸运的是,这个定义calc3
可以很好地与上面的gatherResults
/calculated
代码块一起使用。