2017-10-18 18 views
0

I @ defer.inlineCallbacks 로 주석이 클래스는,/트위스트 파이썬에서 연기 메서드에서 반환 된 값을 할당하는 방법

@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 

I (나는이에서 기계 목록을 반환 할)가 다른 파이썬 파일에 정의 된 다른 클래스를 가져야합니다. 여기서 위 메서드를 호출하고 machineList를 읽습니다.

returned = LdapClass().getMachines() 
    print returned 

인쇄물에 <Deferred at 0x10f982908>이 표시됩니다. 목록을 어떻게 읽을 수 있습니까?

답변

0

inlineCallbacksDeferred으로 작업하기위한 대체 API 일뿐입니다.

대부분 콜백 함수 작성을 피하기 위해 inlineCallbacks을 성공적으로 사용했습니다. 그래도 returnValue을 사용하는 것을 잊었습니다. 교체 :

yield self.machineList 

defer.returnValue(self.machineList) 

이 비록, 당신에 대해 요구하고 문제가 해결되지 않습니다. inlineCallbacks내부에의 다른 API를 제공하지만 외부는 장식하지 않습니다. 눈치 챘을대로, 장식 된 함수를 호출하면 Deferred이됩니다.

returned = LdapClass().getMachines() 
def report_result(result): 
    print "The result was", result 
returned.addCallback(report_result) 
returned.addErrback(log.err) 

또는 inlineCallbacks 좀 더 사용 :

Deferred에 (결국 및 errback) 콜백을 추가

@inlineCallbacks 
def foo(): 
    try: 
     returned = yield LdapClass().getMachines() 
     print "The result was", returned 
    except: 
     log.err()