Общее правило для словарного ключа - вы хотите, чтобы он был неизменным.Если вы внесете изменение в ключевой объект, внутренняя структура данных dict испортится.
Изображения очень изменчивы, вы можете изменить пиксель в любое время.Изменяемые объекты не заботятся о реализации метода __hash__
, потому что он будет бесполезен.Вот что говорит вам сообщение об ошибке.
Лучше использовать прокси для изображения.Одно хорошее предложение в другом ответе состоит в том, чтобы использовать имя файла изображения, но это предполагает, что каждое изображение происходит из файла, и нет никаких повторяющихся изображений с разными именами файлов.Другой способ - заморозить содержимое изображения во что-то неизменное, например, строку байтов, но это будет крайне неэффективно, потому что строка байтов будет большой.Вы можете решить эту проблему, используя криптографический хеш для получения строки, уникальной для каждого входного изображения.
import hashlib
def ImageID(im):
return hashlib.md5(im.tobytes()).hexdigest()
Этот метод полезен не только для dict
с.Я использовал его для ключей базы данных для обложек mp3, так как многие файлы будут делиться изображением.