在Python 2.x中,字符串可以用str或unicode两种类型来表示,这在3.x中变成了str和bytes两种类型,而且其定义也发生了很多改变。如果对于只处理ASCII字符的程序来说,这基本没有什么区别,但如果对于处理一些例如图像和音频等二进制数据的时候,就必须注意这个区别了。而对迁移一些老代码来说,令人讨厌的问题也在这里。
Python 3.x中的改变,如果是处理non-ASCII的Unicode文本数据,显然变得更直接和简洁,但在一些其它场景下,忽视这种变化往往带来许多莫名奇妙的麻烦。Python 3.x的str是指Unicode Text ,包括了8-bit和更广范围的编码,而二进制数据用bytes来处理(还有一个bytearray),对于过去在2.x中直接用str类型处理二进制程序的脚本来说,如果要迁移到3.x下,有些场景必须要更精细的处理。
这些场景包括了使用re这个正则Module来进行匹配时,如果处理的数据是bytes类型的,需要将你编写的正则表达式前也加上b转换为同等类型,否则会出现类型不匹配的异常。在使用pack中的struct和pickle时同样会遇到这个问题,而最麻烦的事情在于处理BOM上,有时候你必须要很小心地精确指定读写时使用的编码类型,这里也与2.6中的一些使用习惯改变比较大。
虽然Python 3.x里的这些变化从理论上是非常好的,但这种不能向后兼容的做法会给过去积累的代码在升级过程中造成很多的麻烦问题,更何况有些接口的底层还是基于C写的,也难怪官方同时还会支持2.6.x数年的时间。
以上的内容是针对CPython,而不包括IronPython和Jython之类。
No Comments »
No comments yet.
RSS feed for comments on this post. TrackBack URL
Leave a comment