本文目的为整理所有py2和3的差异,为学习或者代码兼容/重构提供参考。
本文资料参考:
1、https://www.cnblogs.com/geogre123/p/10837462.html
2、lib2to3源码
3、https://www.jianshu.com/p/ea54c2c7a3ea
4、https://www.cnblogs.com/zhaop8078/p/11363237.html
一、基本语法差异
相关字符 | python2 | python3 | 解决方法 | 备注 |
str.decode() str.encode() |
只有str类型,encode和decode返回结果都是str | 返回结果是bytes | bytes是py3新增的类型 | |
字符串默认编码 len(str) |
根据函数头注释编码,如果是utf8编码,一个中文算3个长度 |
默认均使用unicode编码,一个中文算一个长度 | len(str.encode("utf-8")) | |
/ | 3 / 2 -> 1 | 3 / 2 -> 1.5 | 使用// | |
type: int 和 long |
两种整形 1L |
统一为int 1 |
int | |
sort | sorted(iterable, cmp=None, key=None, reverse=False) | sorted(iterable, key=None, reverse=False) | 手动修改/不使用 | 移除了cmp参数 |
函数定义 | 不可以用中文定义 | 可以用中文 | ||
raise | raise E, V, T | raise E(V).with_traceback(T) | lib2to3可以修复 | |
关键字参数 | 限定关键字参数 *后的变量必须加入名字=值 | |||
解包 |
>>> def unpacks(a, (b, c)): ... return a,b,c |
>>> def unpacks(a, b): |
||
高级解包 | 高级解包操作:a,b,*rest = range(10) | 关于解包,细碎的问题比较多 | ||
except | except (Exception1, Exception2), target | except (Exception1, Exception2) as target | lib2to3可以修复 | |
import | import导入自建包 | 导入系统包 | from . import | |
round |
round返回值为浮点。 |
round返回值为整形(如果第二个参数为空)。 |
||
关键字 | 函数 | lib2to3可以修复 | ||
exec | 关键字 | 函数 | lib2to3可以修复 | |
metaclass | __metaclass__ attribute | metaclass parameter | lib2to3可以修复 | |
不等于 | <> | != | lib2to3可以修复 | |
for ... in ... | for i in 1, 2, 3 | for i in (1, 2, 3) | lib2to3可以修复 | |
StandardError | 移除 | lib2to3可以修复 | ||
Class | 旧式类和新式类两种 | 移除旧式类 |
二、移除的函数/关键字
python2 函数 | python3 对应修改 | 备注 |
内建函数:coerce() | def cmp(): return (a > b) - (a < b) | |
内建函数:cmp() | 使用numeric operator | |
内建函数:raw_input() | input() | lib2to3可以修复 |
file() | open(pathname) | 如果是检查类型,使用io.IOBase |
关键字:execfile | exec() | lib2to3可以修复 |
range() return list xrange() return genrator |
range移除 xrange重命名为range |
|
内建type:buffer | 使用 memoryview | |
apply() | ||
long() | int() | |
basestring() | str() | |
intern() | sys.intern() | |
内建函数:__nonzero__ | ||
iterkeys() itervalues() iteritems() |
keys() values() iterms() |
三、函数返回值差异
函数 | python2 | python3 | 备注 |
filter() | return list | return iterator | lib2to3可以修复 |
zip() | return list | return iterator | |
map() | return list | return iterator |
四、移除的成员函数
python2 | python3 | 备注 |
iterator.next() | next(iterator) | lib2to3可以修复 |
sys.exitfunc |
atexit | lib2to3可以修复 |
sys.maxint | sys.maxsize | |
sys.exc_type sys.exc_value sys.exc_traceback |
sys.exc_info()[0] sys.exc_info()[1] sys.exc_info()[2] |
|
os.getcwdu() | os.getcwd() | |
itertools.(imap|ifilter|izip) | (map|filter|zip) | |
itertools.ifilterfalse | itertools.filterfalse (bugs 2360-2363) | |
operator.isCallable(obj) |
hasattr(obj, '__call__') |
|
d.has_key(k) | k in d | |
for x in f.xreadlines() | for x in f |
五、移除的成员属性
python2 | python3 | 备注 |
dict.iterkeys |
iter(dict.keys) |
lib2to3可以修复 |
d.viewkeys() |
d.keys() |
|
iter.next | next(iter) | |
f.func_closure |
f.__closure__ |
|
method.im_func |
method.__func__ |
|
六、移除的模块
python2 | python3 | 备注 |
dbm |
dbm.ndbm |
lib2to3可以修复 |