2017-10-18 5 views
0

Ich habe 2 Python-Klassen in zwei Dateien.Rendite gibt keine in Python?

  • Datei: LdapConnection, Klasse: LdapClass(), Methode: getMachines (Selbst-)

    @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 
    

oben print-Anweisungen drucken alle entires im machineList

  • Datei : Verdrehte, Klasse: Caching, Methode: loadsettings (Selbst-)

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

in der obigen Klasse meines Druck druckt None. Was mache ich hier falsch?

+0

Ich habe versucht, den Code zu formatieren, aber es ist wirklich vor gebrochen. Ich bin mir also nicht sicher, ob ich recht habe. Bitte prüfe. – Sraw

+0

Mögliches Duplikat [Was ist das Ergebnis einer Ausbeute Ausdruck in Python?] (Https://stackoverflow.com/questions/10695456/what-is-the-result-of-a-yield-expression-in-python) – Aaron

+0

Können Sie Ihr Beispiel auf ein [minimales, vollständiges und verifizierbares Beispiel] reduzieren (https://stackoverflow.com/help/mcve)? Es ist schwierig, die genaue Ausgabe zu erhalten, die Sie sehen. Ihre Verwendung von Ertrag ist in der Tat neugierig. Die Kombination von "yield" und "return" scheint verdächtig zu sein, ebenso wie das Zurückgeben von Werten aus Funktionen und das Erstellen von Listen statt einzelner Elemente. Ich würde erwarten, dass die Renditen von "Looped Yield" oder "Yield Yield" lauten, obwohl ich weiß, dass Sie py2 verwenden, das nicht "yield from" hat. –

Antwort

0

Sieht aus wie Ihre loadSettings() Routine ergibt getMachines() Generator, nicht die Ergebnisse aus dem Generator. Vielleicht sollte ersterer "yield from" machen?

+1

die Pars frei Druck gegeben, sie mit Python 2. ' Ertrag von "wurde in 3.3 eingeführt. –

+0

** Zeit für ein Upgrade! ** –

+0

Ich stimme zu. Py 2 ist jetzt tot im Wasser –

2

In getMachines(), nicht yield self.machineList.

Bei einem Verfahren nach defer.inlineCallbacks verziert, welcher Ausbeute Ausbeute Ausführung tut, ist, bis das Argument (a defer.Deferred Objekt) mit einem Wert ruft zurück (wenn es nicht ein defer.Deferred ist, wird es einfach weiter). (Es ähnelt dem neuen Schlüsselwort await in Python 3.) Sie verwenden dies korrekt in loadSettings().

In getMachines(), Sie haben keine defer.Deferred; Sie haben eine list, also geht es weiter. Um diesen Wert an den Aufrufer zurückzugeben, rufen Sie am Ende der Methode returnValue(self.machineList) auf.