迁移至Python3
用过Python的都知道,他有两个互不兼容的大版本Python2和Python3,由于历史遗留问题许多生产环境或库还只支持老版本Python2.
实际上2.7已经发布了近8年,且是最后一个2.x的大版本,并且将于2010(两年后)彻底停止维护,退出历史舞台.
Python3在两年前及更早时的库支持和应用范围确实不太好,有选择困难症的同学都转去Go语言了:) .
幸运的是近两年主流库/框架都已支持Python3,毕竟发布已经10年多了,在新项目中毫无疑问必须用Python3.
之前我在两个新项目已经使用Python3,最近把一个老项目也彻底迁移过来, 这里记录下一些知识点.
string和unicode
Python 2 的 str 是 bytes, Python 3 的 str 是 unicode.
# 字符串和二进制转换
unicode_string.encode() # 默认utf-8
byte_string.decode()
# split现在是bytes的方法
# requests.get(xxx).content返回bytes类型
your_content.split(b',')
# base64编码后返回字节类型,转换为str
base64.b64encode(some_bytes).decode()
语法变化
- 使用print()
- except语句
有用的技巧
使用命令行参数提示兼容性问题:
- python2 -3参数 提示warning
- python3 -bb参数 提示字符串处理差异
# 判断当前运行版本
PY3 = sys.version_info[0] == 3
# 安装pip3
python3 -m ensurepip
# 或者
sudo apt install python3-pip
兼容2和3
除非迫不得已,应该只支持Python3
如果要兼容参考:
扩展阅读
- Pragmatic Unicode :关于unicode的通俗讲解
代码片段
# 对称加密移除padding的帮助函数(py2版本不适用于py3)
def unpad(bytestring, k=16):
"""
Remove the PKCS#7 padding from a text bytestring.
"""
val = bytestring[-1]
if val > k:
raise ValueError('Input is not padded or padding is corrupt')
l = len(bytestring) - val
return bytestring[:l]
def pad(bytestring, k=16):
"""
Pad an input bytestring according to PKCS#7
"""
l = len(bytestring)
val = k - (l % k)
return bytestring + bytearray([val] * val)
Python3 的一些变更
- time.clock(): 从3.3被弃用,3.8彻底不支持。用time.perf_counter() 或 time.process_time()替代