面向开发同事的分享。
整个迁移过程可以看这里。
开发/服务器环境
服务器环境 Ubuntu 16.04 LTS x64, Python 3.5.2
开发环境以 Python3.5 为基准,Python文档请查询 Python3.5 版本
- 新建 Python3 环境的 virtualenv,并且安装 requirements.txt
virtualenv -p /usr/bin/python3 <path/to/virtualenv>
PyCharm 设置新的虚拟环境,设置 Python3.5 的检测
Terminal 可以使用如下命令载入,可以自由在多个 virtualenv 之间切换
cd <path/to/virtualenv> && source bin/activate && cd -
Python3 需要注意的点
基础的 print
现在是函数了,不再是关键词
1 | print('hello world!') |
字符串与字节
没有 unicode 类型。所有的 str 就是 unicode 类型。Python3 严格区分字节和字符串,以前字符串和字节混用的地方都会出问题,需要注意。
常见的问题如下:
- requests 的 response,
text
属性返回的是自动 decode 的字符串。content
属性返回的是未处理的字节。 - redis 所有获取到的返回值,都是字节。如果需要获取到字符串,需要 decode() 。
- 加密相关的,需要二进制数据。原来的字符串需要 encode() 转换成 utf-8 编码的字节。
- json.loads() 接收的是字符串。
- StringIO.StringIO 字节数据替换成 io.BytesIO,字符串使用 io.StringIO。
列表与迭代器
- map,filter,range 之类的返回都是 iterator。
- dict 类型的 keys, values, items 返回 iterator,不再是 list。
- iterator 不具有 len() 方法,使用 len(list(iterator))
- iterator 和 list 大部分方法,基本一致,不需要特别注意。
异常
- expect SomeException as e。
- raise Exception(‘content’)
- Exception 类不再默认含有 message 方法,通过 str 获取到字符串。
单元测试
- 很多 2.6、2.7 新增加的不稳定的方法名称,在 3.0-3.5 版本逐渐移除或者重命名。
- 现在单元测试已兼容 Python3,以后新的单元测试请依照 Python3.5 的文档函数编写。
其他
- 一些内置库、内置函数的变更,用到了,按照 Python3.5 文档更新。
- / 默认是除法。3/2=1.5。整除严格使用 //。
- 统一 long 和 int。
- 强制 absolute_import。
- 可以使用 Type Hints 进行标记(只有标记作用,不影响实际运行)。
1 | def hello(name: str) -> str: |
后续的一些改动
- 全部切换到 Python3 之后,所有的
__future__
引入会删除。 - Python3 buildin 的库,会从 requirements.txt 移除,如 enum。
- 以前的一些兼容代码,也会移除,如 unicode,urlencode。