2016-05-03 19 views
0

私のクラスオブジェクトの空のインスタンスを作成してリストに追加しようとしていますが、オブジェクトを作成しようとするとすぐに新しいデータが追加されます。下記の見:あなたのfor範囲内Pythonリストにクラスオブジェクトを追加する

エラー

Traceback (most recent call last): 
    File "pagerduty.py", line 96, in <module> 
    UserData = User() 
TypeError: 'dict' object is not callable 

コード

class User(object): 
    __attrs = ['Policy','Level', 'StartDate', 'EndDate', 'StartTime', 
       'EndTime', 'Name', 'Mobile'] 

    def __init__(self, **kwargs): 
     for attr in self.__attrs: 
      setattr(self, attr, kwargs.get(attr, None)) 

    def __repr__(self): 
     return ', '.join(
      ['%s: %r' % (attr, getattr(self, attr)) for attr in self.__attrs]) 

OnCallData = [] 
for User in objPolicyData['users']: 
    UserData = User()  
    UserData.Name = User['name'] 
    UserData.Mobile = UserMobile = getUserMobile(User['id']) 
    for OnCall in User['on_call']:  
     UserPolicy = OnCall['escalation_policy'] 
     PolicyName = UserPolicy['name'] 
     if PolicyName.lower().find('test') == -1: 
      UserData.Policy = PolicyName 
      UserData.Level = OnCall['level'] 
      UserData.StartDate = getDate(OnCall['start']) 
      UserData.EndDate = getDate(OnCall['end']) 
      UserData.StartTime = getTime(OnCall['start']) 
      UserData.EndTime = getTime(OnCall['end'])  
OnCallData.append(UserData) 
+6

あなたのクラスと反復する変数の両方が 'User'と呼ばれます – syntonym

答えて

2

User識別子がからの反復値であり、(それをUserData.Name = User['name']で使用した場合)

繰り返しのために別の名前を使用する必要があります。そのような
何か:

for userI in objPolicyData['users']: 
    UserData = User()  
    UserData.Name = userI['name'] 
    UserData.Mobile = UserMobile = getUserMobile(userI['id']) 
    for OnCall in userI['on_call']:  
     UserPolicy = OnCall['escalation_policy'] 
     PolicyName = UserPolicy['name'] 
     if PolicyName.lower().find('test') == -1: 
      UserData.Policy = PolicyName 
      UserData.Level = OnCall['level'] 
      UserData.StartDate = getDate(OnCall['start']) 
      UserData.EndDate = getDate(OnCall['end']) 
      UserData.StartTime = getTime(OnCall['start']) 
      UserData.EndTime = getTime(OnCall['end']) 

注規則を使用して、あなたのために、このバグを防ぐことができること。つまり、小文字(user)と大文字のクラス(User)の変数の名前を開始します。
これはほとんどの変数名と関連しています

+0

その場に感謝します!それを見なかった – AlexW

2

反復処理するクラスと変数の両方がUserと呼ばれています。それらの名前のうちの1つを別の名前に変更します。

慣習では、変数名は小文字です。ですから、私は以下の変更を提案します:

for user in objPolicyData['users']: 
    user_data = User()  
    user_data.name = User['name'] 
    user_data.mobile = UserMobile = getUserMobile(User['id']) 
    for on_call in User['on_call']:  
     user_policy = on_call['escalation_policy'] 
     policy_name = user_policy['name'] 
     if policy_name.lower().find('test') == -1: 
      user_data.policy = policy_name 
      user_data.level = on_call['level'] 
      user_data.start_date = get_date(on_call['start']) 

などです。これは、pep8の命名規則に従います。これにより、あなたのエラーも処理されます。

すでに確立されているスタイルガイドがある場合は、それに従って、User(反復変数)の別の名前を決定する必要があります。

関連する問題