2016-12-01 7 views
0

で始まるタイプCaseのオブジェクトがdictのリストにあります。 Python2で実行しているときに、私はsixライブラリを使用している両方のPythonバージョンを容易にするために、キーと値をループすることができました。Python3 six - AttributeError:カスタムオブジェクトに属性 'items'がありません

class Case: 

    def __init__(self, obj): 

     properties = {} 
     # standardize Boolean properties 
     true_values = ['1', 1, True, 'yes', 'Yes', 'YES'] 
     false_values = ['0', 0, False, 'no', 'No', 'NO'] 
     for (k, v) in iteritems(properties): 
      # standardize TRUE values 
      if v in true_values: 
       properties[k] = True 
      # standardize FALSE values 
      elif v in false_values: 
       properties[k] = False 
      # keep String values 
      elif isinstance(v, str): 
       continue 

     # remove NULL values 
     filtered = {k: v for (k, v) in iteritems(properties) if v != None} 

     # set Case instance attribute for each property 
     for (k, v) in iteritems(filtered): 
      setattr(self, k, v) 

    def __iter__(self): 
     return self 

    def __getitem__(self, key): 
     return self.__dict__.get(key, None) 

    def to_json(self): 
     return json.dumps(self, default=lambda o: o.__dict__) 

Iこのリストをループ、私はsixdocumentationを以下にもかかわらずはAttributeErrorを取得します。

私は、上記のオブジェクトのリストを反復処理:

from six import iteritems 

def transform(case_list): 
    for case in case_list: 
     for (key, value) in iteritems(case): #crashes here 
      #do stuff 

しかしはAttributeErrorを毎回取得:

Traceback (most recent call last): 
File "app/run.py", line 134, in <module> 
main() 
File "/home/user/other.py", line 55, in transform 
for (key, value) in iteritems(case): 
File "/home/user/env/lib/python3.4/site-packages/six-1.10.0-py3.4.egg/six.py", line 581, in iteritems 
return iter(d.items(**kw)) 
AttributeError: 'Case' object has no attribute 'items' 

私はpython3 app/run.pyとそれを呼び出します。なぜiterableを認識しないのですか?

+2

あなたのエラーメッセージは、 'iteritems'を適用しようとしているあなたは私たちを示していないいくつかの完全に異なるコード、から来ています'Case'オブジェクトに追加します。 – user2357112

+0

行55は 'transform'メソッドにあります。もう一つのメソッドは 'transform'をパラメータで呼び出すだけで' Case'のリストですか?申し訳ありませんが、私はあなたのヒントを手に入れません。 – toefftoefftoeff

+1

'six.iteritems()'は '.items()'メソッド(辞書など)を持つオブジェクトであり、あなたのCaseオブジェクトにはそのようなメソッドはありません。その方法を実装すればうまくいきます。 –

答えて

0

私はケースクラスにitems()メソッドを追加することで解決策を見つけた:

def items(self): 
     return zip(self.__dict__.values(), self.__dict__.keys()) 
+1

これは、あなたが望むものとまったく反対であり、また、キーと値のランダムな順序付けもします。代わりに 'self .__ dict __。items()'に依存する必要があります。 –

関連する問題