2017-10-18 16 views
0

J'ai 2 classes python dans deux fichiers.rendement en retour Aucun en python?

  • fichier

    : LdapConnection, classe: LdapClass(), méthode: getMachines (auto)

    @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 
    

ci-dessus les instructions d'impression imprimer tous entires dans le machineList

  • fichier

    : Twisted, classe: Caching, méthode: loadSettings (auto-)

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

dans la classe au-dessus de mes impressions d'impression None. Qu'est-ce que je fais mal ici?

+0

J'ai essayé de formater votre code mais il est vraiment cassé avant. Donc, je ne suis pas sûr que j'ai raison. Vérifiez s'il vous plaît. – Sraw

+0

Copie possible de [Quel est le résultat d'une expression de rendement en Python?] (Https://stackoverflow.com/questions/10695456/what-is-the-result-of-a-yield-expression-in-python) – Aaron

+0

Pouvez-vous réduire votre exemple à [Exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve)? Il est difficile d'obtenir la sortie exacte que vous voyez. Votre utilisation du rendement est curieuse en effet. La combinaison de 'yield' et de' return' semble suspecte, de même que le retour de valeurs obtenues à partir de fonctions et de listes plutôt que d'éléments individuels. Je m'attendrais à des rendements en boucle ou 'rendement de' même si je me rends compte que vous utilisez py2 qui n'a pas de «rendement de». –

Répondre

0

On dirait que votre routine loadSettings() génère le générateur getMachines(), pas les résultats du générateur. Peut-être que le premier devrait faire "yield from"?

+1

Étant donné l'impression gratuite parens, elle utilise python 2. ' le rendement de »a été introduit en 3.3. –

+0

** Temps de mise à niveau! ** –

+0

Je suis d'accord. Py 2 est mort dans l'eau maintenant (enfin) –

2

Dans getMachines(), ne pas yield self.machineList.

Dans une méthode décorée par defer.inlineCallbacks, ce rendement n'est l'exécution de rendement jusqu'à ce que l'argument (objet defer.Deferred) rappelle avec une valeur (si ce n'est pas un defer.Deferred, ça va continuer tout simplement). (Il est similaire au nouveau mot-clé await dans Python 3.) Vous l'utilisez correctement dans loadSettings(). En getMachines(), vous n'avez pas de defer.Deferred; vous avez un list, donc ça continue. Pour renvoyer cette valeur à l'appelant, appelez le returnValue(self.machineList) à la fin de la méthode.