2017-10-18 14 views
0

2つのファイルに2つのpythonクラスがあります。yieldはPythonでNoneを返しますか?

  • ファイル:LdapConnectionクラス:LdapClass()メソッド:

    @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 
    

印刷文上記getMachines(自己)machineList

  • ファイル内のすべてのentiresを印刷します:ツイスト、クラス:キャッシュ、メソッド:loadSettings(self)

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

上記のクラスは私のプリントプリントNoneです。何を私はここで間違っている?

+0

私はあなたのコードをフォーマットしようとしましたが、それは本当に前に壊れています。だから、私は正しいとは確信していません。チェックしてください。 – Sraw

+0

[Pythonのyield式の結果は何ですか?](https://stackoverflow.com/questions/10695456/what-is-the-result-of-a-yield-expression-in-python)の可能な複製 – Aaron

+0

あなたの例を[最小、完全、および検証可能な例](https://stackoverflow.com/help/mcve)に減らすことはできますか?あなたが見る正確な出力を得るのは難しいです。収量のあなたの使用は確かに興味があります。 'yield'と' return'の組み合わせは、関数から値を返し、個々の項目ではなくリストを返すのと同じように、疑わしいと思われます。私はあなたが 'yield from 'を持っていないpy2を使っていることを知っていますが、ループ収率または' yield from'を期待しています。 –

答えて

0

loadSettings()ルーチンはgetMachines()ジェネレータで、ジェネレータの結果ではありません。おそらく前者は "yield from"を実行しているはずですか?

+1

parensフリープリントを与えられた彼女は、Python 2を使用しています。 3.3から導入された。 –

+0

**アップグレードする時間!** –

+0

私は同意します。 Py 2は現在(最終的に)水中で死んでいる –

2

getMachines()では、yield self.machineListとしないでください。 defer.inlineCallbacksによって装飾方法で

引数(defer.Deferredオブジェクトが)(それはdefer.Deferredはない場合、それは単に継続します)の値でコールバックされるまで、どのような収率は、収率の実行ではありません。 (これはPython 3の新しいawaitキーワードに似ています)loadSettings()でこれを正しく使用しています。

getMachines()には、defer.Deferredはありません。 listがあるので、続行します。その値を呼び出し元に戻すには、メソッドの最後にreturnValue(self.machineList)を呼び出します。

関連する問題