Python: нетипичный объект не имеет атрибута __getitem__ . Но это не nonetype

#python #python-2.7 #dictionary #nonetype

#python #python-2.7 #словарь #нетипичный

Вопрос:

Итак, у меня есть этот фрагмент кода:

     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, но тест завершается неудачно, указывая его нетипичный объект. Как так? Вероятно, я что-то здесь упускаю. Кто-нибудь видит, что здесь не так?

Обновить. определение _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. Можете ли вы показать определение вашего self._handle_object метода? чтобы параметры

2. @Nf4r конечно, секундочку. Странно то, что он отлично работает со всеми другими unittests. Теперь я на самом деле писал другой unittest, который, оказывается, также вызывает этот метод, и он выходит из строя таким странным образом.

3. Ну, мне кажется, что этого недостаточно для меня, не видя остальной части кода ( get_attr и handle_method ), чтобы найти решение, но похоже, что в какой-то момент None передается как objects _handle_method метод into, что приводит к этой ошибке. Лучший способ — просто запустить debug .

Ответ №1:

Ну, я допустил глупую ошибку, хотя эта ошибка привела меня в замешательство из-за обратной трассировки. Итак, я смотрел в неправильном направлении.

Проблема была в другом методе, который используется для обновления словаря объектов. Его цель — обновить значение для определенного ключа, если необходимо назначить какой-либо текущий элемент iter (из итерации), если он указан в конфигурации.

В любом случае, проблема заключалась в следующем (в другом вызываемом методе _set_dynamic_rows_data ):

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

Я случайно назначил objects dict этому методу, и поскольку этот метод ничего не возвращает, objects dict будет установлен в None значение . И это было замаскировано этой ошибкой, потому что на первой итерации все было бы в порядке, а во время второй итерации, когда objects dict будет изменен, он начнет сбой, как описано в вопросе.