我可以使用默认字节而不是Unicode的Python 3吗?

我可以使用默认字节而不是Unicode的Python 3吗?,python,Python,是否有一种系统化的方法来运行Python3.x,所有字符串都默认为字节?我发现,当跨越边界(例如与msgpack、Elixir或ZeroMQ交谈)时,我必须不断进行各种扭曲,以确定是否会返回字符串或字节。这是一种完全的痛苦,在我的问题之上增加了一层认知摩擦 比如我有 import argparse parser.add_argument("--nodename") args = parser.parse_args() 然后我需要做的就是得到这个节点名 str(args.nodename) 然

是否有一种系统化的方法来运行Python3.x,所有字符串都默认为字节?我发现,当跨越边界(例如与msgpack、Elixir或ZeroMQ交谈)时,我必须不断进行各种扭曲,以确定是否会返回字符串或字节。这是一种完全的痛苦,在我的问题之上增加了一层认知摩擦

比如我有

import argparse
parser.add_argument("--nodename")
args = parser.parse_args()
然后我需要做的就是得到这个节点名

str(args.nodename)
然而,zeroMQ需要字节,我将在使用zeroMQ的任何地方使用节点名。所以我把它写在前面

nodename.encode()
但是现在每次我想用它来处理一个字符串,比如说连接,我不能这样做,因为我必须先对字符串进行编码。一半的库采用完美的字节数据类型,并将它们作为字符串返回给您,此时,如果要将它们发送到Python之外,您必须将它们再次转换为字节。对于胶水语言来说,这是一场彻底的灾难。每当我跨越边界时,我都必须进行这种编码-解码舞蹈,最糟糕的是,在库之间,无论它们是否将您添加到字符串或字节(如果您向它们发送字节),似乎并不一致

在Python3中,是否有一个默认情况下放弃Unicode的选项,因为它毕竟会说,默认情况下,这意味着它可以更改,或者答案是坚持使用2.7

简而言之,没有。而且你真的不想尝试。你提到了扭曲,但没有给出具体的例子,所以很难给出具体的建议

在本文作者的拙见中,您也不想继续使用Python 2.7,但如果您在2020年后不需要进行错误修复和语言更新,那也没关系

关键是字节和文本之间的所有转换都应该在代码的边界上进行。从输入时使用的任何外部表示进行解码,对输出时希望或需要使用的任何编码进行编码。Python3是为了实现这一区别而编写的,但是理解这种分离应该会给您提供适当的控制,并减少您的挫折感

在Python3中,以文本模式打开文件会导致readline和friends生成Unicode字符串。如果愿意,可以在打开文件时指定编码。以二进制模式打开文件会导致它们生成ByTestRing,您必须对其应用自己的解码才能将其理解为文本

特定系统的PythonAPI是否返回字节或文本取决于作者,调用Python3函数(期望字符串带有bytestring参数)可能会导致混乱和不愉快。所有外部通信网络、文件等都必须以ByTestRing的形式进行,因此要清楚什么是输入上的文本解码和输出上的编码,并以ByTestRing的形式专门处理外部世界

当然,总有一些棘手的情况。我并不羡慕电子邮件包的维护者,他们必须处理包含6位编码的消息,这些消息本身可能包含多种不同编码的附件。但是我通常不需要在如此复杂的环境中工作,希望你也不需要。

简而言之,不。你真的不想尝试。你提到了扭曲,但没有给出具体的例子,所以很难给出具体的建议

在本文作者的拙见中,您也不想继续使用Python 2.7,但如果您在2020年后不需要进行错误修复和语言更新,那也没关系

关键是字节和文本之间的所有转换都应该在代码的边界上进行。从输入时使用的任何外部表示进行解码,对输出时希望或需要使用的任何编码进行编码。Python3是为了实现这一区别而编写的,但是理解这种分离应该会给您提供适当的控制,并减少您的挫折感

在Python3中,以文本模式打开文件会导致readline和friends生成Unicode字符串。如果愿意,可以在打开文件时指定编码。以二进制模式打开文件会导致它们生成ByTestRing,您必须对其应用自己的解码才能将其理解为文本

特定系统的PythonAPI是否返回字节或文本取决于作者,调用Python3函数(期望字符串带有bytestring参数)可能会导致混乱和不愉快。所有外部通信网络、文件等都必须以ByTestRing的形式进行,因此要清楚什么是输入上的文本解码和输出上的编码,并以ByTestRing的形式专门处理外部世界

当然,总有一些棘手的情况。我并不羡慕电子邮件包的维护者,他们必须处理包含6位编码的消息,这些消息本身可能包含多种不同编码的附件。但是我通常不需要在s工作

uch是一个复杂的环境,希望您也一样。

您的问题并不完全清楚,因为您还没有发布任何示例代码和输出。看看这个软件包,看看它是否满足您的需求。需要将字节字符串标记为字节是一个特性,您很快就会习惯这个特性。打破这种区别会导致各种讨厌的语义错误——我希望没有办法满足你的要求。@tripleee或者我们可以做明智的事情,到处运行UTF8,go style,然后问题神奇地消失了。真是一团糟。如果你不使用UTF-8与你沟通,你也会遇到同样的问题。也许这在实践中是一个较小的问题,但并不完全是你可以为长期设计推断未来的事情。@tripleee是的,这很公平。我想我只是在用转换2.7代码来碰壁,它跨越了很多边界,但也做了很多内部字符串操作,我转换的代码变得丑陋、快速。需要适当的重构来清理。您的问题并不完全清楚,因为您还没有发布任何示例代码和输出。看看这个软件包,看看它是否满足您的需求。需要将字节字符串标记为字节是一个特性,您很快就会习惯这个特性。打破这种区别会导致各种讨厌的语义错误——我希望没有办法满足你的要求。@tripleee或者我们可以做明智的事情,到处运行UTF8,go style,然后问题神奇地消失了。真是一团糟。如果你不使用UTF-8与你沟通,你也会遇到同样的问题。也许这在实践中是一个较小的问题,但并不完全是你可以为长期设计推断未来的事情。@tripleee是的,这很公平。我想我只是在用转换2.7代码来碰壁,它跨越了很多边界,但也做了很多内部字符串操作,我转换的代码变得丑陋、快速。需要进行适当的重构来清理。Python 3.6+电子邮件包大修实际上在隐藏复杂性方面做得相当好,尽管有时对我们这些理解和处理这些复杂性的人来说是不幸的。这很公平。但你必须承认,除非我做的前端工作对外语有unicode要求,否则对于99%面向数据科学的python来说,默认情况下unicode是一件痛苦的事情。我很快就发现了为什么2.7转换花了这么长时间,因为当您使用Python作为系统之间的粘合剂,但仍在Python中执行大量内部字符串时,这是一个非常重要的问题,因为字节没有相同数量的字符串操作支持,所以您正在不停地进行冗余编码解码。无论如何,我确实听说这是未来,所以我们必须遵守正确划分边界访问代码的规则。当然。大多数程序员甚至看不到从文本输入文件生成Unicode的Python3机制,而使用Unicode确实丰富了我们所有人都可以使用的字符集,并且避免了这种情况。必须将不同的系统粘合在一起,而不是所有系统都必须尊重文本/字节的区别,这确实意味着您的工作更加困难。祝你好运PS:如果您将自己限制为7位字符,ASCII编码对于字符串/是的转换非常有效,但是要注意可怕的独角兽错误:-Python3.6+电子邮件包大修实际上在隐藏复杂性方面做得相当好,尽管有时对于我们这些理解和处理这些复杂性的人来说是不幸的。这很公平。但你必须承认,除非我做的前端工作对外语有unicode要求,否则对于99%面向数据科学的python来说,默认情况下unicode是一件痛苦的事情。我很快就发现了为什么2.7转换花了这么长时间,因为当您使用Python作为系统之间的粘合剂,但仍在Python中执行大量内部字符串时,这是一个非常重要的问题,因为字节没有相同数量的字符串操作支持,所以您正在不停地进行冗余编码解码。无论如何,我确实听说这是未来,所以我们必须遵守正确划分边界访问代码的规则。当然。大多数程序员甚至看不到从文本输入文件生成Unicode的Python3机制,而使用Unicode确实丰富了我们所有人都可以使用的字符集,并且避免了这种情况。必须将不同的系统粘合在一起,而不是所有系统都必须尊重文本/字节的区别,这确实意味着您的工作更加困难。祝你好运PS:如果您将自己限制为7位字符,ASCII编码对于字符串/是的转换非常有效,但请注意可怕的Unicoder错误:-