2016-10-03 66 views
1

所以我有這樣一段代碼:Python:NoneType對象沒有屬性__getitem__。但它不是nonetype

key = val_cfg['src_model'] 
    print "key: ", key 
    print "objects dict: ", objects 
    print "before Nonetype" 
    print "accessing objects dict: ", objects[key] # line 122 
    print "after" 
    method = self._handle_object(
     val_cfg, objects[val_cfg['src_model']]) 

所以輸出我得到的是這樣的:

key: ir.model.data 
objects dict: {'res.partner': res.partner(22,), 'ir.model.data': ir.model.data()} 
before Nonetype 
accessing objects dict: ir.model.data() 
after 

然後我得到錯誤:

_report.tests.test_vat_report: ` File "/home/user/addons/account_vat_report/models/vat_report.py", line 122, in _handle_method 
2016-10-03 11:32:44,863 31650 ERROR vat_reports openerp.addons.account_vat_report.tests.test_vat_report: `  print "accessing objects dict: ", objects[key] 
2016-10-03 11:32:44,863 31650 ERROR vat_reports openerp.addons.account_vat_report.tests.test_vat_report: ` TypeError: 'NoneType' object has no attribute '__getitem__' 

好這根本不符合邏輯。我打印第122行的結果,但測試失敗,稱其爲NoneType對象。怎麼會這樣?我可能在這裏錯過了一些東西。有人看到這裏有什麼不對嗎?

更新。 定義的_handle_object

@api.model 
def _handle_object(self, val_cfg, obj): 
    """Method to get value from object.""" 
    # check if value is list or tuple of strings. 
    if not isinstance(val_cfg['value'], basestring): 
     for val in val_cfg['value']: 
      value = self._get_attribute(obj, val_cfg['value']) 
      # return first value that was retrieved. 
      if value: 
       return value 
     # if we do not get any "True" value, just return last 
     # one. 
     else: 
      return value 
    else: 
     return self._get_attribute(obj, val_cfg['value']) 
+0

你可以顯示你的'self._handle_object'方法的定義嗎?以免參數 – Nf4r

+0

@ Nf4r確定,只需一秒鐘。奇怪的是,它適用於所有其他單位測試。現在我正在編寫另一個單元測試,這恰好也調用了這個方法,並且以這種奇怪的方式失敗。 – Andrius

+0

好吧,看起來對於我來說,如果沒有看到代碼的其餘部分('get_attr'和'handle_method')來找到解決方案,這似乎還不夠,但它看起來像是在某個時候None被作爲「對象」到導致這個錯誤的'_handle_method'方法中。最好的方法就是運行調試。 – Nf4r

回答

1

嗯,我做出愚蠢的錯誤,但這個錯誤讓我困惑,因爲回溯的。所以我看着一個錯誤的方向。

問題在於另一種方法,即用於更新對象字典。它的目的是更新特定鍵的值,如果某些當前iter項(來自迭代)需要在配置中指定時進行分配。

無論如何,問題是這樣的(以另一種方法叫做_set_dynamic_rows_data):

objects = self._update_objects_dict(
         val_cfg, objects, iter_) 

我無意中分配objects字典這種方法因爲該方法不返回任何東西,objects字典將被設置爲None。它被僞裝成這個錯誤,因爲第一次迭代,一切都會好的,在第二次迭代時,當objects字典會被改變時,它會像描述的那樣開始失敗。

相關問題