项目从python2.7移植到python3.6

2019-02-22  本文已影响0人  tafanfly

因为客户需求,项目需要从python2.7移植到python3.6, 下面记录一些移植步骤。

环境配置

sudo apt-get install python3.6-dev
pip install -r requirements.txt

语法差异

(1) long 长整型
Python 2里,非浮点数可分为intlong, 但在Python 3里,只有一类整形int

Python2 Python3
x =1000000000000L x =1000000000000
long(x) int(x)

(2) print 语句
Python 2里,print是一个语句, 但在Python 3里,print()是一个函数, 需要传递参数。

Python2 Python3
print a print (a)
print a, b print (a, b)

(3)字典dict
In python3, Removed dict.iteritems(), dict.iterkeys(), and dict.itervalues().
Instead: use dict.items(), dict.keys(), and dict.values() respectively.

items(),keys(),values() 均返回一个迭代器,需要使用 list() 来转换为列表
且不再支持has_key()方法查询键, 使用in

(4)函数callable()
Python 2里,callable()检查对象是否可被调用,但在Python 3里,函数被取消了。

Python2 Python3
callable(anything) hasattr(anything,'__call__')

(5)处理异常exception
except Exception, e 变成 except Exceptionas e

(6)字节字符串的不同
在python 2.7中 b'str' == 'str' 是True的, 但是在python 3.6是False
导致b'str'.startswith('s') 表达式会报TypeError错误。

In [1]: b'str' == 'str'
Out[1]: False

In [2]: b'str'.startswith('s')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-3d3c7ecc20b2> in <module>
----> 1 b'str'.startswith('s')

TypeError: startswith first arg must be bytes or a tuple of bytes, not str

解决方案:

(7)模块导入import
在当前文件a中导入同级目录的b文件的test 模块, 必须要写清楚路径。

from .b import test (ok)
from b import test (nok)

案例 : python3: ImportError: No module named xxxx [duplicate]

(8)unicode删除了
可以用str函数代替, Unicode in Python3

NameError: name 'unicode' is not defined

(9)文件的读写
'rb', 'wb' : 处理对象是字节
'r', 'w' : 处理对象是字符串

(10)reduce高阶函数
在Python 3里,reduce() 函数已经被从全局名字空间里移除了,它现在被放置在fucntools 模块里

from functools import reduce

(11)socket连接
在Python 3里,socket.recv/sent数据必须是bytes类型。

socket.recv(bufsize[, flags])
socket.send(bytes[, flags])

所以一般用到的socket client/server, http server 都需要发送 bytes数据。
(12)StringIOBytesIO

from io import StringIO, BytesIO

StringIO只接受str, BytesIO 可以接受bytes

(13)函数属性func_*
在Python 3里,这些特殊属性被重新命名了,下面列举两个。

Python2 Python3
a_function.func_name a_function.__name__
a_function.func_doc a_function.__doc__

更多区别详见: python2 与 python3 语法区别

上一篇下一篇

猜你喜欢

热点阅读