Наименее полезная ошибка: TypeError: unhashable type: 'list'

Я только что переписал большой кусок кода Django, связанный с FSM с 40 состояниями. Существует множество STATE_DEFINITIONS = "4.7.1" для каждой из трех задействованных моделей и множество проверок, если текущее состояние == SOME_STATE или в [ONE_STATE, OR_ANOTHER].

Есть только одно место, где я использую словарь. скажем, одна из моделей выглядит так:

class OneModel(models.Model):
    STATUS_ONE = "1.0"
    STATUS_TWO = "2.0"

    STATUS_MAPPING = {
              STATUS_ONE:OtherModel.STATUS_X,
              STATUS_TWO:OtherModels.STATUS_Y,
    }

Все ключи представляют собой уникальные строки, и если я уберу их из кода, произойдет то же самое.

Когда я python manage.py test my_app получаю, пожалуй, наименее полезное сообщение об ошибке: TypeError: unhashable type: 'list' Вот и все, ни строчки, где это происходит, ни контекста. Есть ли у кого-нибудь какие-либо предложения о том, как отладить это, не включающее построчный просмотр 800+ в файле?


person Andres    schedule 05.12.2013    source источник
comment
Передача списка в качестве ключа к словарю, но списки изменяемы, поэтому не могут быть ключами словаря.   -  person jarmod    schedule 05.12.2013
comment
Используется ли текущее состояние в наборе или как ключ dict где-либо?   -  person John La Rooy    schedule 05.12.2013
comment
См. обходной путь, который вполне может сработать: http://stackoverflow.com/questions/16581572/django-manage-py-does-not-print-stack-trace-for-errors   -  person Tim Peters    schedule 05.12.2013
comment
Если вы преобразуете свой список в кортеж, вы сможете использовать его как ключ dict или set. Однако вы также хотели бы, чтобы элементы кортежа сначала были неизменяемыми.   -  person dstromberg    schedule 05.12.2013
comment
Пожалуйста, прочитайте вопрос. Проблема, с которой я сталкиваюсь, заключается в том, чтобы найти, где в моем коде происходит ошибка. --traceback сделал это.   -  person Andres    schedule 05.12.2013


Ответы (3)


Попробуйте передать параметр --traceback.

person bruno desthuilliers    schedule 05.12.2013
comment
Спасибо, это сработало :) - person Andres; 05.12.2013

Проверьте manage.py поведение при поглощении исключений; может быть что-то вроде:

try:
    ....
except Exception, exc:
    print exc.message

Если вы найдете его, сделайте его raise вместо этого, чтобы вы могли видеть всю трассировку.

person Ethan Furman    schedule 05.12.2013
comment
Manage.py действительно тонкий, просто оболочка вокруг execute_from_command_line в django.core.management, мне придется копнуть глубже. Спасибо за предложение - person Andres; 05.12.2013

Если у вас установлен ipython, вы можете попробовать:ipython -i manage.py test my_app. затем введите команду %debug для ее отладки.

person HYRY    schedule 05.12.2013
comment
Хорошо, скачиваю iPython. Давно собирался попробовать. Сообщу, что найду, как только загрузится - person Andres; 05.12.2013