为什么 python3 不能友好地兼容 python2? - V2EX
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
rensung
V2EX    Python

为什么 python3 不能友好地兼容 python2?

  •  
  •   rensung 2017-06-28 23:36:41 +08:00 12122 次点击
    这是一个创建于 3031 天前的主题,其中的信息可能已经有所发展或是发生改变。
    高高兴兴地装了 python3;
    高高兴兴地找到了一个 python 模块;
    很不高兴地发现这个 python 模块只能用于 python2;
    很不高兴地装了 python2。
    85 条回复    2017-07-01 17:01:18 +08:00
    defunct9
        1
    defunct9  
       2017-06-28 23:43:53 +08:00 via iPhone   5
    高高兴兴的用了 p2,结果被 encode、decode 折磨了个半死
    donething
        2
    donething  
       2017-06-29 02:10:09 +08:00 via Android
    为什么 python3 好用的 MySQL 连接库都没有?
    MIMEIK
        3
    MIMEIK  
       2017-06-29 08:03:20 +08:00 via Android
    因为 py3 和 py2 本来就不是一种语言呀
    摔()
    rensung
        4
    strong>rensung  
    OP
       2017-06-29 08:20:04 +08:00 via Android
    @MIMEIK 我一直以为改一改就运行了,以后出了 py4 不就有蛋疼了
    CYKun
        5
    CYKun  
       2017-06-29 08:56:09 +08:00 via Android
    因为后向兼容就是很难做呀,不然 java 也不会有那么多人骂了。
    to2false
        6
    to2false  
       2017-06-29 09:01:03 +08:00
    兼容问题,是时候喊出那一句话了,PHP 是世界上......
    Tyanboot
        7
    Tyanboot  
    PRO
       2017-06-29 09:04:40 +08:00 via Android
    @donething pymysql
    keysona
        8
    keysona  
       2017-06-29 09:04:45 +08:00   1
    破坏 & 重生。

    py3 大法好。

    除了 遗留项目,现在 统一 py3.
    RealLiuSha
        9
    RealLiuSha  
       2017-06-29 09:16:48 +08:00   3
    python 1989 年发明,第一个公开发行版发行于 1991 年
    utf8 由 Ken Thompson 于 1992 年创建
    chenyu0532
        10
    chenyu0532  
       2017-06-29 09:20:19 +08:00
    因为 py 爸爸设计的就不能兼容啊。。。老老实实用吧。。这个问题没有为什么
    Phariel
        11
    Phariel  
       2017-06-29 09:39:02 +08:00 via Android
    Swift 不是同样的道理 为什么不能好好的兼容前面的版本

    因为压根就没考虑过兼容问题
    justtery
        12
    justtery  
       2017-06-29 09:53:45 +08:00 via Android   3
    没升级 python3 的 python 包你就当它死了就好了
    jason19659
        13
    jason19659  
       2017-06-29 09:58:46 +08:00
    所以一般都装 2 个版本的 py
    janxin
        14
    janxin  
       2017-06-29 10:03:09 +08:00
    kinghui
        15
    kinghui  
       2017-06-29 10:03:13 +08:00
    @donething #3 我们目前在尝试把在开发中的 Python2 项目迁移到 Python3, MySQL 连接库我们目前在尝试使用 https://github.com/PyMySQL/mysqlclient-python ,
    tankb52
        16
    tankb52  
       2017-06-29 10:04:14 +08:00
    兼容是个无底的坑。
    leavic
        17
    leavic  
       2017-06-29 10:04:58 +08:00   1
    非商业语言的有点就是敢于大破大立,只管对错不管利益。
    imn1
        18
    imn1  
       2017-06-29 10:09:43 +08:00   2
    @to2false
    当年很多人知道下一个任务是改遗留程序 php4 -> php5,就辞职了
    eloah
        19
    eloah  
       2017-06-29 10:11:12 +08:00   1
    Rust 表示,兼容是什么
    gouchaoer
        20
    gouchaoer  
       2017-06-29 10:11:13 +08:00
    这是 py 犯下的最愚蠢的错误,当然了我能不用就不用这门语言
    gouchaoer
        21
    gouchaoer  
       2017-06-29 10:14:49 +08:00
    我就不懂了,你把 /这种基本操作符的意义都变了,除了给库开发者造成冒犯,有毛意义
    print 加不加括号有毛意义
    一堆抖 M 么
    zhengxiaowai
        22
    zhengxiaowai  
       2017-06-29 10:48:00 +08:00   4
    py2 很大一部分是兼容 py1 导致的,你看看 python 诞生的时间,比 java 还早好多年,很多现在的丑陋的在当时来看是很优雅的实现。
    python 是一种简单又复杂的语言,取决于使用方式。举个栗子,元编程的强大,大家都知道。目前很好实现元编程的只有 Python 和 Ruby。python 排序所用的 timsort 算法的高效被很多语言实现的排序作为参考(来自《流畅的 Python 》)。
    @gouchaoer 你不懂就要多看书,不是瞎喷。print 加不加括号取决于 print 是作为函数还是关键字。作为函数的话实用性远远大于关键字。
    要我说,python3 出来的第一天就要停止 python2 的开发才对,哈哈哈哈哈!
    ke1e
        23
    ke1e  
       2017-06-29 10:48:01 +08:00
    print 加括号它就是个函数,不加括号它就是个表达式
    kinghui
        24
    kinghui  
       2017-06-29 10:51:04 +08:00   1
    @gouchaoer 不是加不加括号, 而是从一个表达式变成了函数, 引用 https://stackoverflow.com/a/6241519 提到的其中一个好处就是可以像如下方式使用 print:

    >>> [print(x) for x in range(10)]

    print 并不会对兼容性造成太多的困扰, 毕竟很少有库里直接使用 print, 而且 print 这种非常容易修改. 最大的不兼容就是底层使用 Unicode 重新实现, 同时严格区分了 字节序(bytes) 和 Unicode(str). 比如 Python2 中 bytes 和 unicode 可以相互比较, 但是在 Python3 中是不允许的:

    Python2:

    >>> b'abc' in u'cc abc' # True

    Python3:

    >>> b'abc' in 'abc' # TypeError

    还有比如 Python2 中只要是字符串类型(str,unicode) 都有 format/decode/encode 方法, 但是 Python3 中仅允许 Unicode(str) 有 encode/format 方法, bytes 不允许有 format 方法, 等等等.

    这样做的好处是让语言更加严谨, 其他一些库的不兼容可能主要是由于这个原因导致, 也有部分可能是破窗效应: 反正不兼容那就做些大调整, 比如换个名啥的.

    还有一些类似 MySQLdb 这样的库不兼容是因为 Python3 的 C API 也不兼容, 导致这些用 C 写的扩展库不支持 Python3, 就像 #8 说的, 除非一些已死的项目(想 MySQLdb) 基本上都已经(或正在)同时兼容 Python2 和 Python3.
    tempban
        25
    tempdban  
       2017-06-29 11:00:22 +08:00
    @gouchaoer 以前同事初学 python2 的时候,调试全靠 print。后来我想优雅的重载 print 向 log 输出,做不到....
    到了 python3 重载 print()后,就随便他们怎么 print 了
    gouchaoer
        26
    gouchaoer  
       2017-06-29 11:16:39 +08:00
    @zhengxiaowai
    @tempdban
    你不用为 py 的 print 辩解了,我这个外行教 guido 怎么兼容,简单的很:
    对 py3 而言,print 如果不加括号,ok 这是一个关键字;如果加了括号,这是一个函数,你想怎么重载怎么重载
    tempdban
        27
    tempdban  
       2017-06-29 11:31:01 +08:00
    @gouchaoer 我不是辩解我是举例来说明,加上括号确实是有意义的:
    "print 加不加括号有毛意义"
    至于能不能做到兼容,那就不在我举得那个例子的范围里了。
    RealLiuSha
        28
    RealLiuSha  
       2017-06-29 11:31:27 +08:00   7
    RealLiuSha
        29
    RealLiuSha  
       2017-06-29 11:32:11 +08:00   1
    @tempdban 不用给 php 解释这些东西
    BOYPT
        30
    BOYPT  
       2017-06-29 11:33:38 +08:00
    感觉今年看到的逼都在这个帖子里了
    gimp
        31
    gimp  
       2017-06-29 11:37:54 +08:00   2
    “我这个外行教 guido 怎么兼容”

    有趣 :)
    Kongyuan
        32
    Kongyuan  
       2017-06-29 11:38:26 +08:00   2
    最近被 python3 的数据库链接库给纠结坏了。 找了半天才找到个合适库:

    如果你也在找链接 MySQL 的请参考:

    * pymysql - 怎一个幔子了得。好在 docker 的 image 不用准备 mysql 的包了。
    * mysqlclient-python - 就是 python2.x MySQLdb 的替代品。 对于的 乖乖去下载 mysql 安装包和 dev 库吧

    然后,这年头有谁多进程连数据库不用连接池? 然并卵,pymysql 不支持,mysqlclient-python 支持但用起来复杂。

    所以找了这个

    DBUtils: https://pypi.python.org/pypi/DBUtils/1.2 (support both python2.x/3.x)

    发现找到了救星。 顺便说一下为了找这个库,翻遍了 github 上的各种 python3 mysql pool 的项目。 弄了一下午 (逃)
    cashew
        33
    cashew  
       2017-06-29 11:41:31 +08:00
    Java 到是一直在做兼容,然后就越来越臃肿了。
    ixiaohei
        34
    ixiaohei  
       2017-06-29 11:45:17 +08:00
    表示做 java 的看你们讨论 py2 和 py3 迁移问题都很 happy,另外你们要是以后切换 py4 是不是有得吐槽一番,有些东西能废弃就废弃吧,一直抱着老的,还怎么去拥抱新的,另外 java 很多时候为了兼容老的,出个新东西都得多久...
    ixiaohei
        35
    ixiaohei  
       2017-06-29 11:45:56 +08:00
    不过不用头痛的是,java 切换高级版本,很多老的都可以用。
    gouchaoer
        36
    gouchaoer  
       2017-06-29 11:51:29 +08:00   2
    @cashew 得了吧,java 语言很简洁很规矩,兼容做的很好,jvm 也做得好,社区成熟库多不折腾,真正的工业级语言,这么好用的基础设施。。。这么说吧,java 是最好的语言
    ty89
        37
    ty89  
       2017-06-29 11:52:55 +08:00
    所以我现在尽量只用 ror 做 web 开发了
    nullcc
        38
    nullcc  
       2017-06-29 11:57:14 +08:00
    长远来看肯定是要用 py3 的,这点没有任何疑问
    smithtel
        39
    smithtel  
       2017-06-29 11:58:35 +08:00 via iPhone
    @gouchaoer 求不引战
    AnyISalIn
        40
    AnyISalIn  
       2017-06-29 12:00:26 +08:00
    主要问题是一些三方库可能不支持 Python 3,但是如果自己写的话,还是很容写 2.7 -> 3.6 都兼容的代码的
    jiangzhuo
        41
    jiangzhuo  
       2017-06-29 12:00:32 +08:00
    最近用了 six 感觉好一点
    gouchaoer
        42
    gouchaoer  
       2017-06-29 12:02:58 +08:00   1
    @smithtel 你不战一战怎么把那些只知道人云亦云、掌握了一个技术栈就只知道敝帚自珍的小白骂醒,真的好的技术是不怕拿出来比较的。而且我又不是大神没啥包袱,引战啊煽风点火啥的我挺喜欢的
    tairan2006
        43
    tairan2006  
       2017-06-29 12:29:32 +08:00
    其实不反对 Python3 不兼容,反对的是好不容易不兼容了,你就不能多改一些么…比如更快一点…
    ivechan
        44
    ivechan  
       2017-06-29 12:33:55 +08:00
    一天到晚宣传程序员需要学习的新技术多的是你们, 可 Python3 都出来了差不多十年了,
    还有人在讨论 XX 库为什么不兼容 Python2 这种问题。。
    xijiangtao
        45
    xijiangtao  
       2017-06-29 12:43:11 +08:00
    @donething pymysql,python-mysql 之类的,搜索一下都是好多一堆教你怎么连接 Mysql 的
    0915240
        47
    0915240  
       2017-06-29 12:50:18 +08:00 via iPhone
    java 是臃肿,但兼容确实做的很好。
    cashew
        48
    cashew  
       2017-06-29 12:50:52 +08:00
    @gouchaoer 说简洁、说臃肿也是相对于别的语言,这些本身就没什么好争的,各个语言各有千秋。说 Java 繁重,也恰恰说明它是一个靠谱好用的语言,更何况 Java 在各个领域都有闪光点也证明它本身。
    我也无意去说什么,毕竟 Java 是编译型语言和 Python 解释型语言相比本身就不恰当。
    xrlin
        49
    xrlin  
       2017-06-29 12:54:01 +08:00 via iPhone
    @ty89 ruby 的 string 和 symbol 如果没有规定统一使用,稍有不慎就踩坑了。
    xiaolanglang
        50
    xiaolanglang  
       2017-06-29 12:56:10 +08:00
    你看为了兼容,Java 的泛型都成了什么样了……
    demerol
        51
    demerol  
       2017-06-29 13:26:45 +08:00 via Android
    php js 就是个很好的例子
    robertding
        52
    robertding  
       2017-06-29 13:30:08 +08:00
    @kinghui 终于要迁移了啊。。。
    VmuTargh
        53
    VmuTargh  
       2017-06-29 13:55:55 +08:00
    有些花就是习惯在烂泥里面生活了,给它个好环境反倒枯萎了。
    zhangbohun
        54
    zhangbohun  
       2017-06-29 14:24:41 +08:00 via Android
    说起来因为 print 要加括号所以我一直没升级 py3,哈哈哈哈哈哈
    chnyang
        55
    chnyang  
       2017-06-29 14:44:08 +08:00
    @donething 还是用 PHP 访问数据库方便点,python 好麻烦 API 也没有 PHP 那么好用
    ty89
        56
    ty89  
       2017-06-29 14:48:22 +08:00
    @xrlin 对对对 作为新手踩的第一个坑就是这
    clino
        57
    clino  
       2017-06-29 14:56:37 +08:00
    我一直觉得 python 每一个大的版本只做一个大的不兼容的更改,我看升级就妥妥的没问题
    就是步子跨太大,大跃进了以后成本就高了
    mimzy
        58
    mimzy  
       2017-06-29 14:58:56 +08:00
    @zhangbohun #54 估计你知道 不过可以这样嘛 from __future__ import print_function
    mimzy
        59
    mimzy  
       2017-06-29 15:00:07 +08:00
    @zhangbohun #54 对了反应过来你的意思是不想加括号…啊那就不是我表达的意思了…
    lxy
        60
    lxy  
       2017-06-29 15:16:22 +08:00
    @gouchaoer
    print(2, 3) 在 py2 输出的是 tuple:"(2, 3)",py3 是"2 3"。你的兼容方式并不能兼容。
    visonme
        61
    visonme  
       2017-06-29 15:23:10 +08:00
    因为 py3 的设计者门,一开始就是把 py3 作为一个新的东西打造,而不是单纯作为 PY2 的升级版
    fy
        62
    fy  
       2017-06-29 15:28:11 +08:00   1
    简单,移除不支持 python3 的库。

    因为它们多半是三年以上不更新的过时库,换社区里更好的替代品。
    gouchaoer
        63
    gouchaoer  
       2017-06-29 15:37:22 +08:00
    @lxy py 的 tuple 的(2, 3)是写成(2, 3,)的,而且这个和我的兼容方式无关,这个 tuple 也很蛋疼啊,过度设计
    Chrisplus
        64
    Chrisplus  
       2017-06-29 15:58:03 +08:00
    python 3 最大的原罪,就是他的名字叫 python 3 吧……

    如果叫 snake1 估计都没这么多口水
    ipwx
        65
    ipwx  
       2017-06-29 16:08:24 +08:00   1
    @gouchaoer 首先,(2,3) 是没有问题的,和 (2,3,) 同义。(2,) 才是强制要写的。你肯定记错了。要不就是 f((2,3)) 的用法。但是 f((2,3)) 也可以不加最后那个逗号呀。

    其次,我实在是不懂你为什么这么仇视 Python。我从学习 Python 以来已经六年了,学会写 2&3 兼容性代码、setup.py
    以及完善的单元测试也已经两年了。我用 Python 写过很多东西,从脚本到网站( Flask + Webpack + Vue.js ),再到深度学习的模型( TensorFlow ),体验一直都不错。

    我现在写 Python 的代表性作品可以参考 https://github.com/korepwx/mlcomp/tree/devhttps://github.com/korepwx/tfsnippet/tree/dev。另外我还给 https://github.com/thu-ml/zhusuan 贡献了点代码。

    (事实上 TFSnippet 就是我在用 ZhuSuan 的过程中感觉有些东西写不出来,所以仿写并改写的一个轮子)。
    northisland
        66
    northisland  
       2017-06-29 16:12:05 +08:00 via iPhone
    优雅的 python 生了两个婊子,一个叫 2,一个叫 3
    gouchaoer
        67
    gouchaoer  
       2017-06-29 16:19:50 +08:00
    @ipwx 那的确是我记错了,我其实大学本科的时候还蛮喜欢 py 的,后来语言接触多了发现 py 的很多设计很糟,但是还是一堆人跪舔,如果我当初要选一门脚本语言入门的话绝不会选 py ;你要说我仇视 py 那就仇视吧,我指出的问题那是实实在在,就事论事
    bytelee
        68
    bytelee  
       2017-06-29 16:24:29 +08:00
    如果让你用了 Swift 你还不去 apple 总部自焚
    ipwx
        69
    ipwx  
       2017-06-29 16:40:41 +08:00
    @gouchaoer 我的意见是这样的:我比较喜欢 Python,不是因为它语言有多好,而是因为它能很快完成我要做的一切事情。你看我要做的事情从 Web 开发(“写博客”遗留下来的爱好)到运维脚本(管实验室的服务器要用)到写深度学习的模型和在集群上调度实验脚本( PhD 的本职),样样都有。

    我是不想开发个博客或者类似的 Web 应用就要去熟悉一下 C#、Java 或者 PHP 的程序栈,毕竟这只是我的爱好而不符合我的职业规划;我也不想学习 Bash 那种反人类的语法;至于深度学习就更别提了,靠谱的库全是 Python 的。

    所以我喜欢用 Python,因为只有它能让我只熟悉一门语言就搞定所有事情。要不然,我还得同时维护好几个语言自己经常用的轮子代码吗?
    ipwx
        70
    ipwx  
       2017-06-29 16:43:35 +08:00
    @gouchaoer 从我这样的需求出发看问题,你会觉得网上热捧那么多语言的人真是吃饱了撑着的。对我说的就是 OCaml、Haskell、Scala ……等各种语言的狂热爱好者,语法再好,功能再多,你能让我快快乐乐地写个 Deep Generative Model 吗?
    jyf
        71
    jyf  
       2017-06-29 17:56:49 +08:00
    @gouchaoer py 设计还行啊 就是实现蛮糟糕的 去看 ceval 就知道了
    ShindouHIkaru
        72
    ShindouHIkaru  
       2017-06-29 18:20:01 +08:00
    @gouchaoer 为了埋这个伏笔,你也是蛮拼的。。。
    l00t
        73
    l00t  
       2017-06-29 18:51:41 +08:00
    所谓向下兼容的意思就是你得保留所有错误。
    lrxiao
        74
    lrxiao  
       2017-06-29 18:53:39 +08:00
    建议这楼里的人都好好看看
    https://docs.python.org/3/whatsnew/3.0.html
    并且看看里面提案的 PEP 是怎么写的...

    举几个优点黑点
    优点:unicode 新式类 新的字符串格式化方法 各种各样更优雅的语法
    缺点: 性能慢了 与旧库难兼容

    就指着个 print 瞎喷...233333
    lrxiao
        75
    lrxiao  
       2017-06-29 18:57:20 +08:00
    像 Py2 这种 True/False 都不是关键字 while(1)和 while(True)因为这个 VM 没法优化...这不是屎设计吗
    sagaxu
        76
    sagaxu  
       2017-06-29 19:12:22 +08:00 via Android
    @gouchaoer 所以你选择了最优雅的 php
    sagaxu
        77
    sagaxu  
       2017-06-29 19:13:52 +08:00 via Android
    @lrxiao 3 的性能已经赶上 2 了,3.6 的 dict 是优化过的,还是保序的
    lrxiao
        78
    lrxiao  
       2017-06-29 19:16:15 +08:00
    @sagaxu 嗯是的 忘记提了...
    mingyun
        79
    mingyun  
       2017-06-30 00:19:34 +08:00
    可能需要这个 pip install 3to2
    zjlin1984
        80
    zjlin1984  
       2017-06-30 08:42:31 +08:00
    看了很多评论
    Septembers
        81
    Septembers  
       2017-06-30 11:05:18 +08:00 via iPhone
    @justtery 还有一种选择翻修这个库
    assad
        82
    assad  
       2017-06-30 16:05:42 +08:00
    我是来看评论的
    RaymondLiu
        83
    RaymondLiu  
       2017-06-30 20:45:28 +08:00 via iPhone
    @ipwx 赞 我初学 python 一年 向你学习
    mathgl
        84
    mathgl  
       2017-07-01 00:40:45 +08:00
    壮士断腕

    py2 是没料到有这么成功,想填坑发现已经太迟,于是开个新的...你要不要跟进就不好说了。
    Huozic
        85
    Huozic  
       2017-07-01 17:01:18 +08:00
    比较好奇楼主用的什么模块?已经用了 PY3 几年了,日常没遇过什么包不支持 PY3 了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5500 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 06:35 PVG 14:35 LAX 23:35 JFK 02:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86