yield在python中没有返回?

时间:2017-10-18 03:30:01

标签: python twisted

我在两个文件中有2个python类。

  • file:LdapConnection,class:LdapClass(),method:getMachines(self)

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

以上打印报表打印machineList

中的所有内容
  • file:Twisted,class:Caching,method:loadSettings(self)

    @defer.inlineCallbacks 
    def loadSettings(self):
    
        returned =  yield LdapClass().getMachines()  
        print returned
    

在上面的课程中,我的打印件打印None。我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

getMachines()中,请勿yield self.machineList

在由defer.inlineCallbacks修饰的方法中,在参数(一个defer.Deferred对象)使用值回调(如果它不是defer.Deferred,它')之前,yield会执行什么产生执行。我会继续)。 (它与Python 3中的新await关键字类似。)您在loadSettings()中正确使用了此。

getMachines()中,您没有defer.Deferred;你有一个list,所以它继续。要将该值返回给调用者,请在方法结束时调用returnValue(self.machineList)

答案 1 :(得分:1)

看起来您的loadSettings()例程正在产生getMachines()生成器,而不是生成器的结果。也许前者应该做“yield from”?