Python中想做个兼容2.7/3.5+的库,有什么合适的代码规范推荐?

null
Python中想做个兼容2.7/3.5+的库,有什么合适的代码规范推荐?

19 回复

six

不是说你 6,是真有个库叫 six


__future__ 导入、six 库和条件判断处理主要差异点就行。

核心要处理这几个地方:

  1. 统一导入方式
from __future__ import print_function, division, absolute_import, unicode_literals
  1. 字符串处理
    six 处理文本/二进制数据:
import six

text = six.text_type('hello')  # unicode in py2, str in py3
binary = six.binary_type(b'bytes')
  1. 标准库重命名
from six.moves import urllib  # 兼容 urllib, urllib2, urllib.parse 等
  1. 类定义
from six import with_metaclass

class Base(six.with_metaclass(ABCMeta, object)):
    pass
  1. 迭代器方法
    six.iteritems(dict) 替代 .items()six.next(iterator) 处理 next() 方法。

  2. 异常语法

try:
    # ...
except Exception as e:  # py2/3 都支持 as 语法
    pass
  1. 整数除法
    __future__ 导入后 / 是真除法,// 是地板除。

  2. 测试与打包
    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:

<iframe src="https://www.youtube.com/embed/klaGx9Q_SOA" class="embedded_video" allowfullscreen="" type="text/html" id="ytplayer" frameborder="0"></iframe>

不过除非你有非常好的理由要支持 Python 2, 不要.

大部分公司都用 python3,用 2 的很少

求不要兼容 2

我上次碰到一个库只支持 3,因为要在一个 2 的项目里引用,于是我改成也支持 2
我觉得比较麻烦的还是字符串,大概用了 six 和 future 吧

标准库一般用 six 兼容,语法就不用 py3 新语法

BTW,我觉得不妨将 Target 设为 3.6+

标准库为什么要兼容…

#16 兼容 2 和 3 标准库中的不同写法

标准库不是跟随特定 py 版本发布的吗,为什么要兼容。可以说标准库在不同 py 版本使用不同的写法

回到顶部