是否有系统的方法来运行Python 3.x,所有字符串默认为字节?我发现当"越过边界"例如,与msgpack,Elixir或ZeroMQ交谈,我不得不做各种各样的扭曲,不断弄清楚是否会返回字符串或字节。这是一个彻底的痛苦,并在我的问题之上增加了一层认知摩擦。
例如我有
import argparse
parser.add_argument("--nodename")
args = parser.parse_args()
然后获取我需要做的节点名
str(args.nodename)
然而,zeroMQ想要字节,并且我将在任何地方使用nodename我使用zeroMQ。所以我用
预先设置字节nodename.encode()
但是现在每次我想用一个字符串来表示串联时,我不能这样做,因为我必须先对字符串进行编码。有一半的库采用了非常好的字节数据类型并将它们作为字符串返回给您,此时如果要将它们发送到Python之外,则必须将它们再次转换回字节。对于"胶水语言"这是一场灾难。每当我越过边界时,我都必须编码解码跳舞,最糟糕的是它在库之间似乎不一致,无论它们是否将字符串或字节发送给字符串或字节。
在Python 3中有一个选项可以放弃默认的Unicode(因为它毕竟会说,"默认情况下为#34;建议可以更改),或者是答案"坚持2.7"。
答案 0 :(得分:4)
简而言之,没有。你真的不想尝试。你提到扭曲但没有给出具体的例子,因此很难提供具体的建议。
在这位作者的拙见中,你是否想要坚持使用Python 2.7,但如果你在2020年之后不需要错误修正和语言更新,那就无所谓了。
关键在于字节和文本之间的所有转换都应该在代码的边界处进行。在输入上解码(来自任何外部表示),在输出上进行编码(对您希望或需要使用的任何编码)。编写Python 3是为了强制执行这种区分,但理解分离应该可以为您提供适当的控制并减少您的挫败感。
在Python 3中,以文本模式打开文件会导致readline
和朋友生成Unicode字符串。如果愿意,可以在打开文件时指定编码。以二进制模式打开文件会导致它们生成字节串,您必须应用自己的解码才能将它们理解为文本。
特定系统的Python API是否返回字节或文本取决于其作者,并且调用Python 3函数期望带有bytestring参数的字符串可能会导致混淆和不快乐。所有外部通信(网络,文件等)必须以字节串的形式进行,因此要明确什么是文本(输入上的解码和输出上的编码),并且只在字节串中处理外部世界。
当然,总有一些困难的角落案例。我不羡慕email
包的维护者,他们必须处理包含6位编码字节流的消息,这些消息本身可能包含多种不同编码的附件。但是,我通常不必在如此复杂的环境中工作,希望你也不会。