Метод хеширования и UnicodeEncodeError - PullRequest
0 голосов
/ 16 июня 2009

В Python 2.5 у меня есть следующая хеш-функция:

def __hash__(self):
  return hash(str(self))

Это хорошо работает для моих нужд, но теперь я начал получать следующее сообщение об ошибке. Есть идеи о том, что происходит?

return hash(str(self))
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 16: ordinal not in range(128)

Как я могу это исправить?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 16 июня 2009

Проблема в том, что вы пытаетесь хэшировать строку, которая не конвертируется в ASCII. Метод str принимает объект Unicode и по умолчанию преобразует его в ASCII.

Чтобы решить эту проблему, вам нужно либо напрямую хешировать объект Unicode, либо преобразовать строку с использованием правильного кодека.

Например, вы можете сделать это, если вы читаете юникод с консоли в локализованной системе Windows в США:

return hash(mystring.encode("cp437"))

С другой стороны, данные из реестра или функций API могут быть закодированы как:

return hash(mystring.encode("cp1252"))

Обратите внимание, что кодировка для локальной системы варьируется в зависимости от локализации, поэтому вам необходимо выяснить, для чего используется библиотека локалей.

Я заметил, что вы конвертировали str (self), что означает, что вам нужно переопределить метод __str__ для выполнения там кодирования, и, вероятно, в __repr__ для затронутых объектов.

http://boodebr.org/main/python/all-about-python-and-unicode

Это хорошая ссылка, которая содержит много полезной информации о Python и Unicode. В частности, см. Раздел «Почему не печатается?»

1 голос
/ 16 июня 2009

Ошибка не в функции __hash__, а в функции __str__.

Попробуйте str(yourobject) в объекте с проблемой, и вы поймете, что я имею в виду.

Пожалуйста, отредактируйте вопрос и добавьте свою функцию __str__ (и соответствующие данные), чтобы мы могли указать вам, как ее исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...