#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 будет изменен, он начнет сбой, как описано в вопросе.