2017-10-18 70 views
0

我有一个类,它被注释为@ defer.inlineCallbacks (我想返回从这个机器列表)如何从Python中的延迟方法/扭曲的分配返回值

@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>。我如何阅读清单?

回答

0

inlineCallbacks只是与Deferred一起使用的替代API。

您已经成功使用inlineCallbacks以避免编写回调函数。尽管你忘了使用returnValue。替换:

yield self.machineList 

defer.returnValue(self.machineList) 

不能解决你问这个问题,虽然。 inlineCallbacks给你一个不同的API 里面的它装饰的功能 - 但不在外面。正如你所注意到的,如果你调用一个装饰它的函数,你会得到一个Deferred

添加回调(和errback可,最终)至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()