Исключение: Неразменимый тип 'dict' в наборе Python [дубликат]

Вы можете указать возвращаемый тип, используя интерфейс, класс и т. д. Например, вы можете использовать что-то вроде следующего:

return this.http.get('http://localhost:3000/sidebar/edit-sidebar');

В качестве примера можно определить боковую панель как:

interface Sidebar {
    _id: string;
    content: string;
}

См. . Выделение ответа из угловых документов для получения дополнительной информации:

... TypeScript правильно сообщит, что Объект, возвращающийся из HTTP, не имеет свойства результатов. Это связано с тем, что в то время как HttpClient проанализировал ответ JSON в Object, он не знает, какая форма этого объекта.

blockquote>

95
задан Junuxx 8 November 2012 в 18:10
поделиться

1 ответ

Вы пытаетесь использовать dict в качестве ключа к другому dict или в set. Это не работает, потому что ключи должны быть хешируемыми. Как правило, только неизменяемые объекты (строки, целые числа, float, frozensets, кортежи неизменяемых) являются хешируемыми (хотя возможны исключения). Так что это не сработает:

>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'

Чтобы использовать dict в качестве ключа, вам нужно превратить его во что-то, что может быть хэшировано первым. Если dict, который вы хотите использовать как ключ, состоит только из неизменяемых значений, вы можете создать его хешируемое представление следующим образом:

>>> key = frozenset(dict_key.items())

Теперь вы можете использовать key в качестве ключа в dict или set:

>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}

Конечно, вам нужно повторять упражнение всякий раз, когда вы хотите что-то искать с помощью dict:

>>> some_dict[dict_key]                     # Doesn't work
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> some_dict[frozenset(dict_key.items())]  # Works
True

Если dict вы хотите использовать в качестве ключа значения, которые сами являются dicts и / или списками, вам необходимо рекурсивно «заморозить» предполагаемый ключ. Вот отправная точка:

def freeze(d):
    if isinstance(d, dict):
        return frozenset((key, freeze(value)) for key, value in d.items())
    elif isinstance(d, list):
        return tuple(freeze(value) for value in d)
    return d
156
ответ дан KeepCalmAndCarryOn 25 August 2018 в 11:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: