Python中想做个兼容2.7/3.5+的库,有什么合适的代码规范推荐?
null
Python中想做个兼容2.7/3.5+的库,有什么合适的代码规范推荐?
six
不是说你 6,是真有个库叫 six
用 __future__ 导入、six 库和条件判断处理主要差异点就行。
核心要处理这几个地方:
- 统一导入方式
from __future__ import print_function, division, absolute_import, unicode_literals
- 字符串处理
用six处理文本/二进制数据:
import six
text = six.text_type('hello') # unicode in py2, str in py3
binary = six.binary_type(b'bytes')
- 标准库重命名
from six.moves import urllib # 兼容 urllib, urllib2, urllib.parse 等
- 类定义
from six import with_metaclass
class Base(six.with_metaclass(ABCMeta, object)):
pass
-
迭代器方法
用six.iteritems(dict)替代.items(),six.next(iterator)处理next()方法。 -
异常语法
try:
# ...
except Exception as e: # py2/3 都支持 as 语法
pass
-
整数除法
__future__导入后/是真除法,//是地板除。 -
测试与打包
在setup.py中声明兼容性:
setup(..., python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*')
用 tox 同时测多个 Python 版本。
总结:优先用 six 和 future 抹平差异,保持代码统一。
其实还有个 five 我在 pika 里见过 233
不用做了 py2 都要死了
现在都在讨论什么时候删除 Python 2 支持了
https://python3statement.org/#sections40-timeline
居然还有 seven,eight…
大部分公司都用 python2,用 3 的很少
去掉 2 兼容,节约不必要的 hack
能不兼容 Python2 就别兼容吧…公司新开了个系统基于 Python2,用惯了 Python3 的我想死…
参见 Pycon 2018 的这个 video:
不过除非你有非常好的理由要支持 Python 2, 不要.
大部分公司都用 python3,用 2 的很少
求不要兼容 2
我上次碰到一个库只支持 3,因为要在一个 2 的项目里引用,于是我改成也支持 2
我觉得比较麻烦的还是字符串,大概用了 six 和 future 吧
标准库一般用 six 兼容,语法就不用 py3 新语法
BTW,我觉得不妨将 Target 设为 3.6+
标准库为什么要兼容…
#16 兼容 2 和 3 标准库中的不同写法
标准库不是跟随特定 py 版本发布的吗,为什么要兼容。可以说标准库在不同 py 版本使用不同的写法

