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)
当然,它不是因为 a 而失败TypeError
,而是因为UnicodeEncodeError
. UnicodeEncodeError
当您尝试将 unicode 编码为字符串时应该引发。
当我的猜测是 Hashlib 默默地尝试将 unicode 转换为字符串时,我认为我离事实并不太远。
现在。我同意,hashlib 表明参数hashlib.md5()
应该是字符串或只读缓冲区,即 unicode 字符串。但这实际上表明它实际上不是:hashlib.md5()
将与字符串一起正常工作,仅此而已。
当然,这导致的主要问题是您会得到一些 unicode 字符串的异常,而不是其他一些字符串。
这引出了我的问题。首先,您对 hashlib 实现这种行为的原因有什么解释吗?第二,它是否被认为是一个问题?第三,有没有办法在不改变模块本身的情况下解决这个问题?
Hashlib 基本上就是一个例子,当提供 unicode 字符串时,还有几个其他模块的行为相同 - 这会导致您的程序将使用 ASCII 输入但完全因重音而失败的情况令人不舒服。