我想要一种宏/覆盖类型的解决方案来转换
的每个实例"hello {}".format("wörld")
到
u"hello {}".format("wörld")
我可以查找/替换现有代码,但是我想确保以后对format
函数的任何调用都会导致上述更改。
我尝试过
from __future__ import unicode_literals
几乎可以完成工作,但是它将所有字符串文字转换为unicode。这会导致某些旧的库损坏,仅需要str
个对象。
答案 0 :(得分:0)
在文件开始时,只需包含以下语句:
from __future__ import unicode_literals
默认情况下,它将使文件中的所有字符串文字成为unicode对象,就像在Python 3中一样-
如果您需要Python2字节字符串,请在其前面加上b
。
我知道您说您已经尝试过此方法,但这就是这样:
您应该在程序中显式使用unicode文本,并将encode
传递给您提到的较早版本库的任何库调用中传递的任何文本-并且应涵盖所有所有调用。
是的-在多语言世界中正确处理文本非常困难,并且每个人都拥有Unicode文本是Python 3的主要修复。您正面临着导致Python开发人员选择使用10-长达一年的语言兼容性中断。
我看到有一个mypy-Python静态类型提示检查器-可以在Python 2中运行。也许您可以对其进行调整以发现对代码中需要字节字符串的库的所有调用,因此调用这些库之前,您无需忘记编码部分(或用b""
声明文字)的风险。
是的,我知道答案不会让你开心。 :-)
我想想可以减轻这种情况的一件事就是拥有一个初始代码,该代码将对您提到的“旧库”中的调用进行猴子补丁全部每个传递的参数,并在运行时将其编码为字节串(并解码所有字节串返回值)。 (然后,是的,请使用from __future__ import unicode_literals
并仅在所有代码库中使用unicode字符串)
如您所见,为每个调用手动编码字节串听起来更加理智。