如何在python / twisted中使用defer方法分配返回值

时间:2017-10-18 02:01:50

标签: python twisted twisted.web

我有一个类,注释为@defer.inlineCallbacks (我想从这里返回机器清单)

 @defer.inlineCallbacks
    def getMachines(self):
        serverip = 'xx'
        basedn = 'xx'
        binddn = 'xx'
        bindpw = 'xx'
        query = '(&(cn=xx*)(objectClass=computer))'
        c = ldapconnector.LDAPClientCreator(reactor, ldapclient.LDAPClient)
        overrides = {basedn: (serverip, 389)}
        client = yield c.connect(basedn, overrides=overrides)
        yield client.bind(binddn, bindpw)
        o = ldapsyntax.LDAPEntry(client, basedn)
        results = yield o.search(filterText=query)
        for entry in results:
            for i in entry.get('name'):
                self.machineList.append(i)

        yield self.machineList
        return

我在另一个python文件中定义了另一个类,我在其中调用上面的方法并读取machineList。

returned =  LdapClass().getMachines()   
  print returned

印刷品上写着<Deferred at 0x10f982908>。我该如何阅读清单?

1 个答案:

答案 0 :(得分:0)

inlineCallbacks只是使用Deferred的替代API。

您大部分时间都成功使用inlineCallbacks来避免编写回调函数。你忘了使用returnValue了。替换:

yield self.machineList

defer.returnValue(self.machineList)

但这并不能解决您所问的问题。 inlineCallbacks为您提供了一个不同的API 它所装饰的功能 - 但不在外面。正如您所注意到的,如果您调用用它修饰的函数,则会得到Deferred

Deferred

中添加一个回调(以及最终的错误回复)
returned = LdapClass().getMachines()
def report_result(result):
    print "The result was", result
returned.addCallback(report_result)
returned.addErrback(log.err)

或者再使用inlineCallbacks

@inlineCallbacks
def foo():
    try:
        returned = yield LdapClass().getMachines()
        print "The result was", returned
    except:
        log.err()