原文地址:http://old.sebug.net/paper/books/dive-into-python3/porting-code-to-python-3-with-2to3.html
使用2to3
将代码移植到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()
需要你将想要输出的东西作为参数传给它。
Python 2 | Python 3 | </tr> | ② | </tr> | ③ | </tr> | ④ | </tr> | ⑤ | >sys.stderr,1,3 | </tr>
---|
print()
。print()
的一个参数就可以了。print()
即可。print
语句的结尾,它将会用空格分隔输出的结果,然后在输出一个尾随的空格(trailing space),而不输出回车(carriage return)。在Python 3里,通过把end=' '
作为一个关键字参数传给print()
可以实现同样的效果。参数end
的默认值为'\n'
,所以通过重新指定end
参数的值,可以取消在末尾输出回车符。>>pipe_name
语法,把输出重定向到一个管道,比如sys.stderr
。在Python 3里,你可以通过将管道作为关键字参数file
的值传递给print()
来完成同样的功能。参数file
的默认值为std.stdout
,所以重新指定它的值将会使print()
输出到一个另外一个管道。Python 2有两种字符串类型:Unicode字符串和非Unicode字符串。Python 3只有一种类型:。
Python 2 | Python 3 | </tr> | ② | </tr> |
---|
unicode()
Python 2有两个全局函数可以把对象强制转换成字符串:unicode()
把对象转换成Unicode字符串,还有str()
把对象转换为非Unicode字符串。Python 3只有一种字符串类型,,所以str()
函数即可完成所有的功能。(unicode()
函数在Python 3里不再存在了。)
Python 2 | Python 3 | </tr> |
---|
Python 2有为非浮点数准备的int
和long
类型。int
类型的最大值不能超过sys.maxint,而且这个最大值是平台相关的。可以通过在数字的末尾附上一个L
来定义长整型,显然,它比int
类型表示的数字范围更大。在Python 3里,int,大多数情况下,它很像Python 2里的长整型。由于已经不存在两种类型的整数,所以就没有必要使用特殊的语法去区别他们。
PEP237:统一长整型和整型。
Python 2 | Python 3 | </tr> | ② | </tr> | ③ | </tr> | ④ | </tr> | ⑤ | </tr> |
---|
long()
函数也没有了。为了强制转换一个变量到整型,可以使用int()
函数。int
类型(不是long
)的作比较。isinstance()
函数来检查数据类型;再强调一次,使用int
,而不是long
,来检查整数类型。比较运算符
Python 2支持<>
作为!=
的同义词。Python 3只支持!=
,不再支持<>了。
Python 2 | Python 3 | y: | </tr>② | y <> z: | </tr>
---|
has_key()
在Python 2里,字典对象的has_key()
方法用来测试字典是否包含特定的键(key)。Python 3不再支持这个方法了。你需要使用in运算符。
Python 2 | Python 3 | </tr> | ② | </tr> | ③ | </tr> | ④ | </tr> | ⑤ | </tr> |
---|
or
的优先级高于运算符in
,所以这里不需要添加括号。or
的优先级大于in
,这里需要添加括号。(注意:这里的代码与前面那行完全不同。Python会先解释x or y
,得到结果x(如果x)或者y。然后Python检查这个结果是不是a_dictionary的一个键。)in
的优先级大于运算符+
,所以代码里的这种形式从技术上说不需要括号,但是2to3
还是添加了。in
的优先级大于+
。