ошибка: запрос на член '..' в '..', который не является типом класса

Вы пытаетесь использовать 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
400
задан user2864740 24 June 2014 в 05:42
поделиться

1 ответ

Foo foo2();

изменить на

Foo foo2;

Вы получите ошибку, потому что компилятор считает

Foo foo2()

объявлением функции с именем 'foo2' и типом возвращаемого значения 'Foo'.

Но в этом случае Если мы изменим значение на Foo foo2 , компилятор может показать ошибку «вызов перегруженного 'Foo ()' неоднозначен» .

626
ответ дан 22 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

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