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

2017-06-28 23:36:41 +08:00
 rensung
高高兴兴地装了 python3;
高高兴兴地找到了一个 python 模块;
很不高兴地发现这个 python 模块只能用于 python2;
很不高兴地装了 python2。
11629 次点击
所在节点    Python
85 条回复
gouchaoer
2017-06-29 10:14:49 +08:00
我就不懂了,你把 /这种基本操作符的意义都变了,除了给库开发者造成冒犯,有毛意义
print 加不加括号有毛意义
一堆抖 M 么
zhengxiaowai
2017-06-29 10:48:00 +08:00
py2 很大一部分是兼容 py1 导致的,你看看 python 诞生的时间,比 java 还早好多年,很多现在的丑陋的在当时来看是很优雅的实现。
python 是一种简单又复杂的语言,取决于使用方式。举个栗子,元编程的强大,大家都知道。目前很好实现元编程的只有 Python 和 Ruby。python 排序所用的 timsort 算法的高效被很多语言实现的排序作为参考(来自《流畅的 Python 》)。
@gouchaoer 你不懂就要多看书,不是瞎喷。print 加不加括号取决于 print 是作为函数还是关键字。作为函数的话实用性远远大于关键字。
要我说,python3 出来的第一天就要停止 python2 的开发才对,哈哈哈哈哈!
ke1e
2017-06-29 10:48:01 +08:00
print 加括号它就是个函数,不加括号它就是个表达式
kinghui
2017-06-29 10:51:04 +08:00
@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
2017-06-29 11:00:22 +08:00
@gouchaoer 以前同事初学 python2 的时候,调试全靠 print。后来我想优雅的重载 print 向 log 输出,做不到....
到了 python3 重载 print()后,就随便他们怎么 print 了
gouchaoer
2017-06-29 11:16:39 +08:00
@zhengxiaowai
@tempdban
你不用为 py 的 print 辩解了,我这个外行教 guido 怎么兼容,简单的很:
对 py3 而言,print 如果不加括号,ok 这是一个关键字;如果加了括号,这是一个函数,你想怎么重载怎么重载
tempdban
2017-06-29 11:31:01 +08:00
@gouchaoer 我不是辩解我是举例来说明,加上括号确实是有意义的:
"print 加不加括号有毛意义"
至于能不能做到兼容,那就不在我举得那个例子的范围里了。
lgpqdwjh
2017-06-29 11:31:27 +08:00
lgpqdwjh
2017-06-29 11:32:11 +08:00
@tempdban 不用给 php 解释这些东西
BOYPT
2017-06-29 11:33:38 +08:00
感觉今年看到的逼都在这个帖子里了
gimp
2017-06-29 11:37:54 +08:00
“我这个外行教 guido 怎么兼容”

有趣 :)
Kongyuan
2017-06-29 11:38:26 +08:00
最近被 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
2017-06-29 11:41:31 +08:00
Java 到是一直在做兼容,然后就越来越臃肿了。
ixiaohei
2017-06-29 11:45:17 +08:00
表示做 java 的看你们讨论 py2 和 py3 迁移问题都很 happy,另外你们要是以后切换 py4 是不是有得吐槽一番,有些东西能废弃就废弃吧,一直抱着老的,还怎么去拥抱新的,另外 java 很多时候为了兼容老的,出个新东西都得多久...
ixiaohei
2017-06-29 11:45:56 +08:00
不过不用头痛的是,java 切换高级版本,很多老的都可以用。
gouchaoer
2017-06-29 11:51:29 +08:00
@cashew 得了吧,java 语言很简洁很规矩,兼容做的很好,jvm 也做得好,社区成熟库多不折腾,真正的工业级语言,这么好用的基础设施。。。这么说吧,java 是最好的语言
ty89
2017-06-29 11:52:55 +08:00
所以我现在尽量只用 ror 做 web 开发了
nullcc
2017-06-29 11:57:14 +08:00
长远来看肯定是要用 py3 的,这点没有任何疑问
smithtel
2017-06-29 11:58:35 +08:00
@gouchaoer 求不引战
AnyISalIn
2017-06-29 12:00:26 +08:00
主要问题是一些三方库可能不支持 Python 3,但是如果自己写的话,还是很容写 2.7 -> 3.6 都兼容的代码的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/371799

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX