Python:数据与文本?

csc*_*hol 11 python unicode python-3.x

Guido van Rossum关于Python 3000的演讲最后提到了从Python 2到Python 3过渡的几个方面.他特别谈到文本处理,因为转向Unicode是因为Python 3中字符串的唯一表示是主要变化之一.

就文本处理而言,一张幻灯片(#14)说:

  • 在2.6中:
    • 对所有数据使用字节和b'...'(知道这些只是str和'...'的别名)
    • 对所有文本使用unicode和u'...'
  • 在2.5中:
    • '...'表示数据,''...'表示文字

我使用的是Python 2.6.4.这究竟对我意味着什么?

在Python的世界中,数据和文本之间有什么区别?

mjv*_*mjv 18

简而言之,在Py3k中处理文本和数据的方式可能是语言中最"突破"的变化.通过在可能的情况下了解并避免某些Python 2.6逻辑与3.x中的工作方式不同的情况,我们可以在发生迁移时促进迁移.然而,我们应该期望2.6逻辑的某些部分可能需要特别注意和修改,例如处理不同的编码等.

BDFL对幻灯片14的建议背后的想法可能是开始" 使用 "Py3k支持的相同类型(并且只有这些),即字符串(str类型)的unicode字符串和"data"(bytes类型)的8位字节序列.

由于这些类型的语义和相关存储/编码在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'>  
Run Code Online (Sandbox Code Playgroud)

要回答你的问题[在下面的评论中],在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顶部附近)

  • 让你真正想到你是指一串字符还是一串字节也是一种好习惯!唯一的问题当然是你失去了与Python 2.5及更早版本的兼容性. (2认同)