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)
Run Code Online (Sandbox Code Playgroud)
当然,它不会因为a而失败TypeError,而是因为UnicodeEncodeError.UnicodeEncodeError当您尝试将unicode编码为字符串时,应该会引发此问题.
当我猜测Hashlib默默地试图将unicode转换为字符串时,我想我离真相并不太远.
现在.我同意,hashlib表示该参数hashlib.md5()应该是一个字符串或一个只读字符串的只读缓冲区.但这实际上表明它实际上不是:hashlib.md5()将与字符串正常工作,而这是关于它.
当然,这导致的主要问题是你会得到一些unicode字符串的异常,而不是其他一些.
这引出了我的问题.首先,您是否有关于为什么hashlib实现此行为的解释?第二,它被认为是一个问题吗?第三,有没有办法在不改变模块本身的情况下解决这个问题?
Hashlib基本上就是一个例子,有几个其他模块在提供unicode字符串时表现相同 - 这会让你感到一种不舒服的情况,你的程序将使用ASCII输入,但完全失败了重音.
Tho*_*s K 12
它不仅仅是hashlib - Python 2通过尝试将其编码为ascii来处理许多地方的Unicode.这是Python 3的重大变化之一.
在Python 3中,字符串是unicode,它们的行为与您期望的一样:没有自动转换为字节,如果要使用字节(例如,用于MD5散列),则必须对它们进行编码.我相信有些黑客sys.setdefaultencoding在Python 2中使用了这种行为,但我建议不要在生产中使用它们,因为它们会影响在该Python实例中运行的任何代码.
| 归档时间: |
|
| 查看次数: |
1476 次 |
| 最近记录: |