yield возвращает None в Python?

У меня есть 2 класса Python в двух файлах.

  • файл: LdapConnection, класс: LdapClass(), метод: 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

  • файл:Twisted, класс:Caching, метод:loadSettings(self)

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

в вышеприведенном классе мои отпечатки None, Что я здесь не так делаю?

2 ответа

В getMachines()не yield self.machineList,

В методе, украшенном defer.inlineCallbacks, то, что делает yield - это выполнение yield до аргумента (a defer.Deferred объект) перезванивает со значением (если это не defer.DeferredБуду просто продолжать). (Это похоже на новый await ключевое слово в Python 3.) Вы используете это правильно в loadSettings(),

В getMachines(), у вас нет defer.Deferred; у тебя есть listтак продолжается. Чтобы вернуть это значение вызывающей стороне, позвоните returnValue(self.machineList) в конце метода.

Выглядит как твой loadSettings() рутина дает getMachines() генератор, а не результаты от генератора. Возможно, первый должен делать "yield from"?

Другие вопросы по тегам