python 各个版本之间为何差距很大?

2015-08-01 09:29:24 +08:00
 rondo9
python2.0和3.0对于除号和整除有很大差异,不知道开发者为何这样指定规则?
6286 次点击
所在节点    Python
33 条回复
ryd994
2015-08-01 20:05:11 +08:00
其实2.x又不是不维护了,你还可以用啊
zonghua
2015-08-01 20:47:35 +08:00
据说语法最健全完善的是c#?
spacewander
2015-08-01 20:58:59 +08:00
@lilydjwg
试过py3.4下能跑的脚本,在py3.2就报错了,仅仅是因为有一处字符串我用了u'xxx'这样的形式……
原本py3.2已经移除了u'str'这样的语法,但是到了py的下一个子版本,为了兼容py2.7又重新引入这一语法,于是就出现了这样喜闻乐见的现象:

py2.7 ok
py3.2 ouch
py3.4 ok again, wtf?
yakczh
2015-08-01 20:59:37 +08:00
语法最健全完善是ruby
java/python的面向对象都是混搭风格
yakczh
2015-08-01 21:00:51 +08:00
@spacewander 人生苦短就是这么来的
znoodl
2015-08-01 21:19:21 +08:00
因为python是脚本语言,设计的目的是为了解决问题在规范上没有花大功夫,后来的规范和兼容也是没有考虑周全
lilydjwg
2015-08-01 23:22:16 +08:00
@spacewander 是的。因为 3.4 向下兼容 3.2,但是 2 和 3 之间是互不兼容的。重新使用 u 前缀并没有多大的坏处(只是加了个前缀而已,并没有语义上的差异),但是能使迁移顺利一些,何乐而不为呢?
lilydjwg
2015-08-01 23:23:07 +08:00
@Shy07 可是每次 Ruby 小版本升级 Vim 都要打补丁的说!
Shy07
2015-08-02 14:56:55 +08:00
@lilydjwg 那是 Vim 的事,Ruby 升级除了 1.8 升 1.9 那次,其他时候都是升完直接跑的,但是说到底 1.8 到 1.9 语法也没有出现不兼容,只是因为 1.9 增加了字符编码,1.8 的代码需要加上 encoding 信息而已
lilydjwg
2015-08-02 16:45:40 +08:00
@Shy07 细节我不记得了,应该是 C API 不兼容,不然正常的嵌入代码不会报错的。

1.8 到 1.9 中文相关的程序容易出问题。
Shy07
2015-08-02 18:58:39 +08:00
@lilydjwg C API 涉及到 Ruby 的实现问题了,这个确实,我有个项目每次升级 Ruby 解释器都要修改 Ruby 头文件,但这个和 Ruby 本身语法没关系。编码问题加个“#encoding:utf-8”基本解决,同样也和本身语法没关系。

我所知道的语法不兼容,唯一一例就是 1.9 之后“case ... when ...”结构里“when”的后面不能再加冒号了。不过加冒号和 “if ... then ...”、“for ... in ...”一样,都是属于照顾其他语言的用法,不是 Ruby 推荐的用法,不支持也好。

翻一下 Ruby 的更新列表,你会发现 Ruby 在早期语法确定以后,后续版本更新里鲜有重大变化,2.0 的关键字参数,也是在兼容原来语法的基础上增加的。Ruby 的每次更新重点几乎都是 VM、GC,今后还会有并发,并发其实还是和 VM 相关。
怎么说,家家有本难念的经吧,Ruby 自由的语法加上元编程的特性,让 Ruby 创造 DSL 的能力独领风骚,所以 Ruby 的开发团队不需要去纠结 Ruby 的语法,你改多了反倒浪费了 Rubist 的创造力,注意力可以全部放在如何让 Ruby 跑更快上面就可以了。

其他语言则是反过来,在实现了一个强大的 VM 之后,如何让语法更完善、开发效率更高就变成了他们的纠结的事情。最明显的例子莫过于 JS,拍黄片弱爆了,JS 才是世界上最好的语言(认真状)。
lilydjwg
2015-08-02 21:48:24 +08:00
@Shy07 嗯我说的是 Ruby 的实现。语法因为我不写所以不清楚,感觉还好,就是库的不同版本之间的兼容性比 Python 还差的样子。
slideclick
2015-08-03 13:44:56 +08:00
人类的大多数领域,后来者总比前人聪明,因为可以看到前人走过的陷阱。所以cpp比java好。
而python3是语言的自我更新而不是java代替cpp,以不兼容python2为代价,把很多陷阱规避掉。比如2>'3'在p2下面是有值的,这是个陷阱。至于p3改动的那些,为什么那么改,不是一两句可以讨论清楚的,比如print改为函数,可以看pep-3105 https://www.python.org/dev/peps/pep-3105/

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

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

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

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

© 2021 V2EX