Python должен быть строго типизированным.
Например: 'abc'['1']
не будет работать, потому что вы должны предоставить целое число, а не строку. Ошибка будет поднята, и вы можете продолжить и исправить ее.
Но это не относится к hashlib. Действительно, попробуйте следующее:
import hashlib
hashlib.md5('abc') #Works OK
hashlib.md5(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: md5() argument 1 must be string or read-only buffer, not int
hashlib.md5(u'abc') #Works, but shouldn't : this is unicode, not str.
haslib.md5(u'é')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0: ordinal not in range(128)
Конечно, не из-за TypeError
, а из-за UnicodeEncodeError
. Предполагается, что UnicodeEncodeError
возникает, когда вы пытаетесь закодировать Unicode в строку.
Я думаю, что я не так далек от истины, когда предполагаю, что Hashlib молча попытался преобразовать unicode в строку.
В настоящее время. Я согласен, hashlib указал, что аргумент hashlib.md5()
должен быть строкой или буфером только для чтения, что и является строкой Unicode. Но на самом деле это показывает, что на самом деле это не так: hashlib.md5()
будет правильно работать со строками, и это все.
Конечно, основная проблема, которую это вызывает, заключается в том, что вы получите исключение с некоторыми строками Unicode, а не с некоторыми другими.
Что приводит меня к моим вопросам. Во-первых, есть ли у вас объяснение, почему hashlib реализует такое поведение? Во-вторых, считается ли это проблемой? В-третьих, есть ли способ исправить это, не меняя сам модуль?
Hashlib в основном является примером, есть несколько других модулей, которые ведут себя так же, когда предоставляются строки Unicode, что приводит вас к неудобной ситуации, когда ваша программа будет работать с вводом ASCII, но совершенно не работает с акцентами.