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 · 11623 次点击
    这是一个创建于 2703 天前的主题,其中的信息可能已经有所发展或是发生改变。
    高高兴兴地装了 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
    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  
       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.
    lgpqdwjh
        9
    lgpqdwjh  
       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.
    tempdban
        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 加不加括号有毛意义"
    至于能不能做到兼容,那就不在我举得那个例子的范围里了。
    lgpqdwjh
        28
    lgpqdwjh  
       2017-06-29 11:31:27 +08:00   ❤️ 7
    lgpqdwjh
        29
    lgpqdwjh  
       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 的
    windfarer
        46
    windfarer  
       2017-06-29 12:45:23 +08:00 via Android
    又是吵架帖。。
    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 如果没有规定统一使用,稍有不慎就踩坑了。
    gy911201
        50
    gy911201  
       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   ·   实用小工具   ·   3359 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 04:46 · PVG 12:46 · LAX 20:46 · JFK 23:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.