Python:数据还是文本?
Guido van Rossum在有关Python
3000的演示中提到了一些要使从Python
2最终过渡到Python 3的过程。他特别在谈论文本处理,因为向Unicode过渡是Python 3中字符串的唯一表示形式是主要变化之一。
就文本处理而言,一张幻灯片(第14张)说:
- 在2.6版中:
- 对所有数据使用字节和b’…’(知道这些只是str和’…’的别名)
- 对所有文本使用unicode和u’…’
- 在2.5中:
- ’…’表示数据,u’…’表示文本
我正在使用Python 2.6.4。这对我到底意味着什么?
在Python的世界中,数据和文本有什么区别?
-
简而言之,在Py3k中处理文本和数据的方式可以说是语言中最“重大”的变化。通过了解并尽可能避免某些Python
2.6逻辑与3.x不同的工作方式,我们可以在发生迁移时提供便利。但是我们应该期望2.6逻辑的某些部分可能需要特别注意和修改,例如以处理不同的编码等。BDFL在幻灯片14上提出建议的想法可能是“ 使用 ”
Py3k支持的相同类型(并且仅支持这些类型),即,字符串的unicode字符串(str
类型)和“数据”的8位字节序列(bytes
类型)。上一句中的“ 使用 ”一词使用得比较宽松,因为这些类型的语义和关联的存储/编码在2.6和3.x版本之间有所不同。在Python
2.6中,字节类型和关联的文字语法(b’xyz’)仅映射到str类型。因此# in Py2.6 >>'mykey' == b'mykey' True b'mykey'.__class__ <class 'str'> # in Py3k >>>'mykey' == b'mykey' False b'mykey'.__class__ <class 'bytes'>
为了回答您的问题(在下面的评论中),在2.6中,无论您使用b’xyz’还是’xyz’,Python都将其理解为一件事:str。 重要的是,
您应该将它们 理解为[潜在/将来]两种不同的类型,它们具有不同的用途:- str用于类似文本的信息,以及
- 八位字节序列的字节,用于存储手头的任何数据。
例如,再次接近您的示例/问题,在Py3k中,您将能够拥有包含两个具有相似键的元素的字典,一个具有b’mykey’,另一个具有’mykey’,但是在2.6以下,这是不可能的,因为这两个键实际上是相同的;重要的是您知道这种情况,并避免了(或以特殊方式在代码中明确标记)2.6代码在3.x中不起作用的情况。
在Py3k中,str是一个抽象的unicode字符串,是一个unicode代码点(字符)序列,Python处理将其转换为编码形式或从其编码形式转换为任意编码(作为程序员,您确实对编码有发言权,但在处理字符串操作的时间,因此您不必担心这些细节)。相反,字节是8位“事物”的序列,语义和编码完全留给了程序员。
因此,即使Python 2.6没什么区别,通过显式使用bytes()/ b’…’或str()/ u’…’,您…
-
…为即将到来的Py3k类型和语义做好准备,为自己和程序做好准备
-
…使源代码的自动转换(2to3工具或其他工具)更容易,从而b’…’中的b将保留,而u’…’中的u将被删除(因为唯一字符串类型为unicode)。
有关更多信息 :
Python 2.6新增功能 (请参阅PEP
3112字节字面量)
Python 3.0新增功能
(请参见Text Vs. Data Instead Of Unicode Vs. 8-bit
顶部)