使用2to3将代码移植到Python 3
你的位置: Home ? Dive Into Python 3 ?
难度等级: ♦♦♦♦♦
使用2to3
将代码移植到Python 3
? Life is pleasant. Death is peaceful. It’s the transition that’s troublesome. ?
— Isaac Asimov (attributed)
概述
几乎所有的Python 2程序都需要一些修改才能正常地运行在Python 3的环境下。为了简化这个转换过程,Python 3自带了一个叫做2to3
的实用脚本(Utility Script),这个脚本会将你的Python 2程序源文件作为输入,然后自动将其转换到Python 3的形式。案例研究:将chardet
移植到Python 3(porting chardet to Python 3)描述了如何运行这个脚本,然后展示了一些它不能自动修复的情况。这篇附录描述了它能够自动修复的内容。
print
语句
在Python 2里,print
是一个语句。无论你想输出什么,只要将它们放在print
关键字后边就可以。在Python 3里,print()
是一个函数。就像其他的函数一样,print()
需要你将想要输出的东西作为参数传给它。
Notes | Python 2 | Python 3 |
---|---|---|
① | print |
print() |
② | print 1 |
print(1) |
③ | print 1, 2 |
print(1, 2) |
④ | print 1, 2, |
print(1, 2, end=‘ ‘) |
⑤ | print >>sys.stderr, 1, 2, 3 |
print(1, 2, 3, file=sys.stderr) |
- 为输出一个空白行,需要调用不带参数的
print()
。 - 为输出一个单独的值,需要将这这个值作为
print()
的一个参数就可以了。 - 为输出使用一个空格分隔的两个值,用两个参数调用
print()
即可。 - 这个例子有一些技巧。在Python 2里,如果你使用一个逗号(,)作为
print
语句的结尾,它将会用空格分隔输出的结果,然后在输出一个尾随的空格(trailing space),而不输出回车(carriage return)。在Python 3里,通过把end=‘ ‘
作为一个关键字参数传给print()
可以实现同样的效果。参数end
的默认值为‘\n‘
,所以通过重新指定end
参数的值,可以取消在末尾输出回车符。 - 在Python 2里,你可以通过使用
>>pipe_name
语法,把输出重定向到一个管道,比如sys.stderr
。在Python 3里,你可以通过将管道作为关键字参数file
的值传递给print()
来完成同样的功能。参数file
的默认值为std.stdout
,所以重新指定它的值将会使print()
输出到一个另外一个管道。
Unicode字符串
Python 2有两种字符串类型:Unicode字符串和非Unicode字符串。Python 3只有一种类型:Unicode字符串(Unicode strings)。
Notes | Python 2 | Python 3 |
---|---|---|
① | u‘PapayaWhip‘ |
‘PapayaWhip‘ |
② | ur‘PapayaWhip\foo‘ |
r‘PapayaWhip\foo‘ |
- Python 2里的Unicode字符串在Python 3里即普通字符串,因为在Python 3里字符串总是Unicode形式的。
- Unicode原始字符串(raw string)(使用这种字符串,Python不会自动转义反斜线"\")也被替换为普通的字符串,因为在Python 3里,所有原始字符串都是以Unicode编码的。
全局函数unicode()
Python 2有两个全局函数可以把对象强制转换成字符串:unicode()
把对象转换成Unicode字符串,还有str()
把对象转换为非Unicode字符串。Python 3只有一种字符串类型,Unicode字符串,所以str()
函数即可完成所有的功能。(unicode()
函数在Python 3里不再存在了。)
Notes | Python 2 | Python 3 |
---|---|---|
unicode(anything) |
str(anything) |
long
长整型
Python 2有为非浮点数准备的int
和long
类型。int
类型的最大值不能超过sys.maxint
,而且这个最大值是平台相关的。可以通过在数字的末尾附上一个L
来定义长整型,显然,它比int
类型表示的数字范围更大。在Python 3里,只有一种整数类型int
,大多数情况下,它很像Python 2里的长整型。由于已经不存在两种类型的整数,所以就没有必要使用特殊的语法去区别他们。
© 2001–9 Mark Pilgrim
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。