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
"?