获取关于未以'u'前缀的Python字符串字面量的警告
为了遵循Python中处理Unicode的最佳实践,你应该在所有字符的字符串前面加上'u'。有没有什么工具可以提醒你,如果你忘记加这个'u'呢?
3 个回答
KennyTM的评论应该作为一个回答发布:
from __future__ import unicode_literals
这个未来声明可以在Python 2.6和2.7中使用,它让Python 3的字符串写法也能用上。这样的话,不加前缀的字符串就会变成Unicode字符串,而字节数组则需要加一个b
前缀。
你可能想要写一个这样的警告生成工具,可以通过解析Python源代码来实现,使用的是parser
或者dis
这两个内置模块。你也可以考虑把这个功能添加到pylint中。
你应该在所有字符串前面加上 'u'
其实,没必要。
你确实应该在字符字符串前加上 u
,但并不是所有字符串都是字符字符串。当你在处理基于字节的内容,比如网络服务或二进制文件时,你需要使用字节字符串。
比如说,想把一个Unicode字符串写进PNG文件?这不太合理。想对字符串 Y2Fm6Q==
进行base64解码?在这里你不能合理地使用Unicode字符串,因为base64是明确的字节。
当然,Python通常会让你在需要字节字符串的地方传入Unicode字符串,但这只是通过自动转换成ASCII来实现的。如果字符串里有非ASCII字符,你就会遇到 UnicodeError
,这就像在需要Unicode的地方用字节一样。认为“Unicode是对的,字节是错的”是个误区。两种字符串的处理都是必要的。
如果你担心过渡到Python 3,确实应该把你的字符字符串标记为 u''
,但同时也要把你的字节字符串标记为 b''
。那些不重要的字符串可以留作 ''
,让它们在Python 3中自动从字节字符串转换为Unicode字符串。Python 2中很多地方使用字节,而Python 3在合适的地方使用Unicode,但仍然有很多情况下你确实需要使用字节,如果把它转换成Python 3的Unicode会导致问题。
(唯一的问题是 b''
语法需要Python 2.6或更高版本,所以使用它会让你与早期版本不兼容。)