2014-02-10 34 views
0

我有兩種方法,似乎不想與海誓山盟對話。我想,我用我的字典的方式略有錯了,我可能混淆自己有點:循環一個字典。在python中的鍵()

def load(self, msg): 

     loadState = {'foo1' { 'FirstObject':1, 'SecondObject':2 }, 'foo2' { 'FirstObject':3, 'SecondObject':4 }} 

     foo_objects = loadState.keys() 

     for name in foo_objects: 
      if name == 'foo1': 
       ValueTuple = loadState[foo_objects[0]] 
      elif name == 'foo2': 
       ValueTuple = loadState[foo_objects[1]] 

      self.program.supervisor.setI2c(ValueTuple, foo = name) #This is where I think it goes wrong 

然後來存儲這些值,我將它們傳遞到這個方法這是以前的工作,把它doesn」 t等上面的新方法:

def setI2c(self, ValueTuple, foo=None) : 

     for name in foo : 
        object = self.objects[name] 
        for name in ValueTuple : 
         register = reg(name) 
         register.value = regNameValueTuple[name] 

編輯:第一部分,我錯在哪裏:

self.program.supervisor.setI2c(ValueTuple, foo = [name]) 
+0

你需要顯示其他方法的簽名了。循環查看字典時,您已經獲得了每個鍵,然後直接使用該鍵**查找值。你的價值是字典而不是元組。 –

+0

在'setI2c'中你不使用'object'。 –

+0

完成,顯示簽名(我認爲) – fiz

回答

1

load消息可以簡化爲:

def load(self, msg):  
    loadState = {'foo1' { 'FirstObject':1, 'SecondObject':2 }, 'foo2' { 'FirstObject':3, 'SecondObject':4 }} 

    for name, value in foo_objects.iteritems():  
     self.program.supervisor.setI2c(value, foo=name) 

這裏,foo,在loadState的關鍵之一。

然後您在foo中循環setI2c,其中foo仍然是字符串。這意味着你遍歷單個字符:

>>> foo = 'foo1' 
>>> for name in foo: 
...  print name 
... 
f 
o 
o 
1 

你並不需要一個循環可言,你最有可能想要這個:

def setI2c(self, value_dict, foo=None): 
    object = self.objects[foo] 
    for name in value_dict: 
     register = reg(name) 
     register.value = regNameValueTuple[name] 

,但你不實際使用object任何地方你的代碼,這樣行可以完全刪除。

如果setI2c()總是期望foo是名稱的列表,那麼你應該在列表傳遞load

self.program.supervisor.setI2c(value, foo=[name]) 
+0

這當然給了我思考=) – fiz

+0

它並不總是期望一個名字,所以上面我有一個if語句,如果沒有給出名稱,它會執行其他操作 – fiz

+0

iter無法正常工作,它不會設置i2c寄存器,但我的舊循環仍然可以工作,儘管添加了[name] – fiz