V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
patrickstar
V2EX  ›  Python

必须用 python2,但是希望自己的代码能够与 python3 兼容,如何写代码

  •  
  •   patrickstar · 2016-06-29 21:01:26 +08:00 · 6579 次点击
    这是一个创建于 3069 天前的主题,其中的信息可能已经有所发展或是发生改变。
    接触 python 不久,在写一些简单的测试、验证程序,主要用到 pyqt 、 matplotlib 。现在需要给一个大项目写一个小程序必须用到一个库,但是这个库是 python2 的,作者正在准备升级到 python3 ,但是我估计完成至少 1 年以后去了。

    我希望我的代码能够 python2 、 python3 都兼容,有什么好的建议,我基本不会用到 print ,但是异常捕获肯定需要的!
    22 条回复    2016-06-30 23:14:51 +08:00
    fcicq
        1
    fcicq  
       2016-06-29 21:11:49 +08:00   ❤️ 1
    带你在 py3 下的报错信息再来
    WinterWu
        2
    WinterWu  
       2016-06-29 21:27:42 +08:00 via iPhone
    print 现在用 py3 写法也是兼容的。弄好编码格式,其它都是小问题,好改。再做好兼容性检查。看看开源同时支持怎么做的很容易搞清楚的。
    shelltank
        3
    shelltank  
       2016-06-29 21:38:02 +08:00
    可以看看 six(2*3) : https://pypi.python.org/pypi/six
    billlee
        4
    billlee  
       2016-06-29 21:53:19 +08:00   ❤️ 1
    python 3 的异常语法在 python 2.7 里能用啊, except Exception as e:
    新写的代码比较容易兼容,就是不要用 python 2 里被废弃的特性,然后用 __future__ 启用 backported 的新特性:文件头加上
    # -*- coding: utf-8 -*-
    from __future__ import absolute_import, division, print_function, unicode_literals # unicode_literals 和 division 如果没用到也可以不加
    if 'xrange' in dir(__builtins__):
       range = xrange

    比较不好搞的是一些变化大的标准库,比如 ConfigParser (所以我现在都用 json 或 yaml 格式的配置)。
    http://python-future.org 这个库也不错,不过比较简单的代码也没必要额外引入一个这个大的库
    ksc010
        5
    ksc010  
       2016-06-29 21:57:07 +08:00
    1.看下 2 和 3 语法上的不同
    2.尽量使用一些同时兼容 2 和 3 的第三方库(比如 http 相关的直接使用 requests )
    3. 通过 from __future__ import xxxx 使用一些 3 里面才有的功能 具体参考: https://docs.python.org/2/library/__future__.html
    eriale
        6
    eriale  
       2016-06-29 22:04:45 +08:00
    pycharm 里可以代码兼容检查, Code Compatibility Inspection :
    https://www.jetbrains.com/pycharm/whatsnew/
    binux
        7
    binux  
       2016-06-29 22:15:01 +08:00
    我的一篇老文章: http://blog.binux.me/2014/12/porting-to-python-3/
    不过,如果你所依赖的库不支持 python3 ,那还是算了吧。。。没意义
    JerningChan
        8
    JerningChan  
       2016-06-30 00:27:10 +08:00
    那樣的話,你保證好自己代碼的風格,然後以後要用到 py3 時,用 script,自動改就可以呀
    strahe
        9
    strahe  
       2016-06-30 00:30:49 +08:00
    用 3 的习惯来写 2,不要用 2 来兼容 3,我现在就是这样的,问题不大(python2.7 本身就是过度的).
    tinyproxy
        10
    tinyproxy  
       2016-06-30 00:38:26 +08:00
    依赖的作者要升级到 py3 你不一定要用 py3 啊,如果有 bug 或者你需要新 feature , back port 回来不就好了。
    而且一般不会就这么一个依赖吧,你自己写的代码要 2/3 通用好说,但你的依赖不一定是 2/3 通用的。
    shyling
        11
    shyling  
       2016-06-30 00:42:15 +08:00
    1 ,各种 future,例如 unicode_literals,print_function
    2 ,深坑之 str/bytes/unicode ,书写时建议按 3 的规矩来
    3 ,各种库( blackhole)的支持情况以及变化

    总结:都运行运行改错咯
    Arnie97
        12
    Arnie97  
       2016-06-30 02:36:35 +08:00 via Android
    可以试试这个库 https://pypi.python.org/pypi/pies
    Neveroldmilk
        13
    Neveroldmilk  
       2016-06-30 08:21:36 +08:00
    一般做不到跨版本兼容,但是 py 内置的函数按照 py3 的格式写应该也是能在 py2 上运行的。
    ToughGuy
        14
    ToughGuy  
       2016-06-30 08:49:30 +08:00
    pycharm 带有 python3 兼容性检查, 不兼容的地方会提示
    pynix
        15
    pynix  
       2016-06-30 09:42:03 +08:00
    直接用 3 写,跑在 2 下面出问题在做兼容方案。。。
    lovepython
        16
    lovepython  
       2016-06-30 11:22:36 +08:00
    写完以后有一个 2to3 程序,转换下
    glasslion
        17
    glasslion  
       2016-06-30 14:41:03 +08:00
    首先不要把同时兼容 Python2 和 Python3 想得多难,现在大多数的第三库都能做到同时兼容的。

    如果你的项目不开源,只是内部使用的话,只支持一个 Python 版本也未尝不可。先用 Python2 开发, 要迁到 Python3 时, 用 2to3 转换一下就行了, 这样比同时支持 Python2/3 工作量小一些。

    你得知道 Python2 和 Python3 的语法有什么不同, 有什么办法去解决这些这些不同。 [Supporting Python 3: An in-depth guide]( http://python3porting.com/) 这本书总结的很全面,而且开源,可以看看

    选择第三方库时, 注意看它是否支持 Python3 。 Python3 标准库一般也有相应的 backport 的。

    用 Jenkins , Travis CI , tox 之类的工具跑 Python2 + Python3 的 unit test
    glasslion
        18
    glasslion  
       2016-06-30 14:42:14 +08:00
    @billlee configparser 有 Python2 的 backport https://pypi.python.org/pypi/configparser
    julyclyde
        19
    julyclyde  
       2016-06-30 16:39:48 +08:00
    @shelltank 我在 kombu 里还看到个 kombu.five 哈哈
    lowzoom
        20
    lowzoom  
       2016-06-30 21:05:51 +08:00
    用 from __future__ 可以解决大部分基本语法差异,但是不建议导入 unicode_literals ,因为在用 r 前缀字符串表示路径的时候, unicode_literals 会把\u 和后面连带的字符解析成 unicode 码字面值,满烦人的
    而且手动加 u ,可以让你在写代码的时候,脑里会有 str 跟 unicode 的概念,这在 windows 下正确处理外部传进来的参数时还是很重要的
    billlee
        21
    billlee  
       2016-06-30 21:43:33 +08:00
    @lowzoom python 3 里面 str 和 bytes 区分得更加严格,用错会抛异常,比靠程序员来分 unicode 和 str 靠谱多了
    lowzoom
        22
    lowzoom  
       2016-06-30 23:14:51 +08:00
    @billlee 你误会了,我的回复针对的是楼主“必须用 python2 ”提出的
    我想表达的是如果在 python2 里用 from __future__ import unicode_literals 的话,弊大于利
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2836 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 08:42 · PVG 16:42 · LAX 00:42 · JFK 03:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.