如何从 python/twisted 中的 defer 方法分配返回值
How to assign a returned value from the defer method in python/twisted
我有一个class,注释为@defer.inlineCallbacks
(我想从这个return机器列表)
@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 文件中定义了另一个 class,我想在其中调用上述方法并读取机器列表。
returned = LdapClass().getMachines()
print returned
印刷品显示 <Deferred at 0x10f982908>
。我如何阅读列表?
inlineCallbacks
只是与 Deferred
.
一起工作的替代 API
您大部分时间都成功地使用了 inlineCallbacks
来避免编写回调函数。不过你忘了使用 returnValue
。替换:
yield self.machineList
和
defer.returnValue(self.machineList)
不过,这并不能解决您所询问的问题。 inlineCallbacks
给你一个不同的 API 内部 它装饰的功能 - 但不是外部。正如您所注意到的,如果您调用一个用它装饰的函数,您会得到一个 Deferred
.
向 Deferred
:
添加一个回调(最终是一个 errback)
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()
我有一个class,注释为@defer.inlineCallbacks (我想从这个return机器列表)
@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 文件中定义了另一个 class,我想在其中调用上述方法并读取机器列表。
returned = LdapClass().getMachines()
print returned
印刷品显示 <Deferred at 0x10f982908>
。我如何阅读列表?
inlineCallbacks
只是与 Deferred
.
您大部分时间都成功地使用了 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()