3

クラス A には、defer を使用する method_one と method_two の 2 つのメソッドがあります。コールバック関数では、値を 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

前もって感謝します :-)

4

1 に答える 1

3

問題は、method_oneが延期されるため、set_self_valueすぐに呼び出すのではなく、最初に次のステップに移動することですa.method_two()。したがって、その時点では値がまだ設定されていないため、空のリストが取得されます。

コールバック チェーンに追加したmethod_two後に呼び出されることを確認するには:method_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
于 2015-03-19T19:01:16.107 に答える