【问题标题】:twisted defer make the assignment of class instance variables is invalidtwisted defer 使类实例变量的赋值无效
【发布时间】:2015-05-23 00:26:51
【问题描述】:

我有一个类 A 有两个方法,method_one 使用 defer 和 method_two ,在回调函数中,我为 self.value 设置了一个值并将其添加到 defer 的回调链中。但之后 self.value 仍然是 method_two 中的原始值。总之,回调函数中self.value的赋值是无效的。

from twisted.internet import utils, reactor
class A(object):

    def __init__(self):
        self.value = []

    def method_one(self):
        d = utils.getProcessOutput('/bin/sh', ('-c', 'ls /home')) # return a defer
        def set_self_value(result):
            self.value = result.split()  # assign result.split() to self.value
        d.addCallback(set_self_value)

    def method_two(self):
        print self.value  # it is still [] rather than result

a = A()
a.method_one()
a.method_two()
reactor.run()

output:
[]  # i expect self.value is ['lost+found', 'user']
lost+found
user

提前感谢 :-)

【问题讨论】:

  • result 在调用set_self_value 时似乎不包含任何内容。

标签: python twisted twisted.internet


【解决方案1】:

问题在于,由于method_one 被延迟,因此,它不是立即调用set_self_value,而是首先转到下一步a.method_two(),因此当时尚未设置您得到的值一个空列表。

为了确保method_twomethod_one 之后被调用,请将其添加到回调链中:

import twisted
from twisted.internet import utils
from twisted.internet import reactor


class A(object):

    def __init__(self):
        self.value = []

    def method_one(self):
        d = utils.getProcessOutput('/bin/sh', ('-c', 'ls /home'))
        def set_self_value(result):
            print 'called set'
            self.value = 100
        d.addCallback(set_self_value)
        d.addCallback(self.method_two)

    def method_two(self, *args): # *args required to handle the result
        print 'called two'
        print self.value

def main():
    a = A()
    a.method_one()


reactor.callWhenRunning(main)
reactor.run()

输出:

called set
called two
100

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多