2017-01-05 7 views
0

filteredKeys()関数からキーのリストを作成しようとしていますが、関数を呼び出すとTypeErrorが返されます。 'NoneType'オブジェクトは反復可能ではありません。"None"が関数に返されないときにPythonが失敗するのはなぜですか?

filteredKeys()の結果を出力するときに「なし」が存在しませんが、リストに変換すると「なし」はありません。私は何が欠けていますか?それは私を夢中にさせている!値のいずれもfilterString一致しないとき -

 key_list = [] 
     for line in stdout.read().splitlines(): 
      input_line = line 
      input_line = input_line.replace(b'[sudo] password for ufitadmin: ', b'') 
      key_individual = str(input_line, 'utf-8') 
      key_individual = key_individual.replace(
       'cat: /home/%s/.ssh/authorized_keys: No such file or directory' % user, 
       'No key exists for this user.') 
      key_list.append(key_individual) 


     global keyDict 
     keyDict = {} 
     keyDict[host] = key_list 
     filterString = "No key exists for this user." 
     filteredKeylist = [] 

     def filteredKeys(): 
      for key,value in keyDict.items(): 
       for values in value: 
        if values == filterString: 
         return key 



     filteredKeylist = list(filteredKeys()) 

     print(filteredKeylist) 
+0

「値はありません」ここでは「値の値は?」ですか? – ppasler

+2

'filteredKeys'は常に一致を見つけることは確かではありません。一致して「リターンキー」が見つからない場合、暗黙的に 'None'を返します。 –

+2

また、これは** way **以上のコードです。よいSO質問には、自己完結型の小さなコードサンプルがあります(この場合、おそらく、問題がハードコーディングされた 'keyDict'と' filterString'を持つ 'filteredKeys'関数を含む*のみ*)。 –

答えて

1

あなたfilteredKeys()機能は、実際にNoneを返す可能性が非常に高いです。

また、filteredKeys()関数からキーのリストを作成することを指定していますが、単一の値(Noneまたは値がfilterStringの最初のキー)を返しますので、WontWorkあなたが期待する通り。

より良い実装はジェネレータ作るために次のようになります。

def filteredKeys(): 
    for key,values in keyDict.items(): 
     if filterString in values: 
      yield key 

filteredKeylist = list(filteredKeys()) 

が、それはまだ書くために無駄に複雑な方法です:

filteredKeylist = [key for key, values in keyDict.items() if filterString in values] 

また世界的にあなたのコードは非常に複雑ようで、私はすでにすることができます各反復で上書きされるkeyDictで明白なバグを発見してください。

+0

あなたの1つのライナーを使用するようにコードを更新しましたが、すべての値を含む大きなリストの代わりに個々のリストを返しています。 返信: '[] [item 1] [] [item 2]'すべてが個別の行にあります。 –

+0

投稿したコードからは何も返されていませんが、それは個々のリストを表示しています。そして、これはループ内でこれをやっているので、各ホストのためにこのリストを作り直しているからです(編集されたコードを参照してください)。これは実際にはまったく別の問題です(もちろん、あなたのコードでは唯一のものではありません、それぞれの反復で 'KeyDict'が上書きされることに注意してください)。私はあなたの質問に答えました(問題の解説と実際の解決策を示しています)、さらにいくつかのヒントを提供しましたが、コード全体をデバッグするつもりはありません。 –

+0

あなたが正しいです、あなたのソリューションは私の質問に答えます。ありがとうございました。 –