Python:NoneType对象没有属性__getitem__。但它不是非类型

时间:2016-10-03 11:37:45

标签: python python-2.7 dictionary 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'])

1 个答案:

答案 0 :(得分:1)

我犯了愚蠢的错误,虽然这个错误让我感到困惑,因为追溯。所以我看错了方向。

问题在于另一种方法,用于更新对象字典。它的目的是更新特定键的值,如果在配置中指定需要分配一些当前iter项(来自迭代)。

无论如何,问题是这个(在另一个名为_set_dynamic_rows_data的方法中):

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

我不小心为此方法分配了objects dict,因为此方法不返回任何内容,objects dict将设置为None。并且它被伪装成了这个错误,因为第一次迭代,一切都会好的,在第二次迭代中,当objects dict被改变时,它就会像所描述的那样开始失败。