最近一段时间,我都在研究编程语言,因为我也想创造一个编程语言, 不过我目前主要用的是 Python
在我看来,一门语言应该减少歧义,语言内要减少分裂
但我发现 Python 越来越复杂了,语法糖越来越多了, 比如:
3.9 版新增的 合并 dict 的操作符 | |=
这 2 个操作符实现的功能,dict 本身的方法就可以容易、直观的实现
增加这 2 个操作符 虽然可以少打几个字, 但是 这样不断的堆砌语法糖, 未来会让这个语言很混乱,
我个人目前没有发现这 2 个操作符带来了多大的价值,有些弊大于利
想问问大家的看法
1
kkocdko 2021-06-23 11:01:46 +08:00
我也这么觉得,再结合一下上次说要优化性能的帖子,感觉似乎有点冲突,不知道这些语法会不会成为性能优化的障碍。
我可能会更关注性能。 |
2
LokiSharp 2021-06-23 11:06:25 +08:00 5
Ptyhon 的语法一直很垃圾,复杂繁琐。完全和它的设计理念相悖。详见油腻的 Ptyhon ( Fluent Python )
|
3
233373 2021-06-23 11:08:02 +08:00 1
魔法师太多了- - 。
|
4
Jwyt 2021-06-23 11:12:36 +08:00
看别人的 python 项目比较痛苦
|
5
glfpes 2021-06-23 11:23:05 +08:00
我认为语法糖不是好的设计,简洁不在于键盘敲的少,而是设计上应该简介,相似的东西应该规约。
|
6
echo1937 2021-06-23 11:29:00 +08:00
@Jwyt #4 这个看法我是同意的,我一直也在思考,这种痛苦更多来自于动态语言的通病,还是 Python 自身的问题。
而且,Python is defined by its implementation,他没有 Specification,感觉加新特性很随意,某些时候缺少通盘考虑。 |
7
chenqh 2021-06-23 11:30:36 +08:00
我只希望 py 的速度有 nodejs 那么快
|
8
Kilerd 2021-06-23 11:39:31 +08:00 via iPhone
来,我们一起骂海象操作符 :=
|
9
huang119412 2021-06-23 11:41:18 +08:00
好的设计都是趋同的,go 不需要泛型,最后变真香。这样看还是 Java 好,繁琐不繁琐意义不大,又不是白板编程,毕竟现在都是智能的 ide 。
|
10
BingoXuan 2021-06-23 11:52:18 +08:00 via Android
语法糖早就已经够用了。性能不行就算了,匿名函数不够強也忍了,但加 type hints 后都几个版本了,还是类型系统还是半吊子。
|
11
lujjjh 2021-06-23 12:04:09 +08:00 1
https://www.python.org/dev/peps/pep-0584/#motivation
不怎么写 Python,看了 motivation 觉得没什么问题,解释了现有的方法有什么不足。Python 本来就吸收了很多函数式的东西,这个特性跟 Python 也挺搭的。 至于要不要用 | 这个运算符,Python 本来就支持运算符重载,语义上看 dict1 | dict2 也挺直观的,所以我觉得这个特性还不错,至少比 := 的争议要少多了。 |
12
keepeye 2021-06-23 12:04:52 +08:00
我用 python 写出来的代码真丑,代码多一些,ide 都要卡半天
|
13
keepeye 2021-06-23 12:05:25 +08:00
感觉 python 写的时候很爽,读的时候很糟心
|
14
WilliamYang 2021-06-23 12:25:56 +08:00
@keepeye 同感,现在再好的 Python 代码,看起来还是很丑,相比于 Go
|
16
hxys 2021-06-23 12:30:01 +08:00
确实,过于脚本化,过于简单有时候反而人类难看懂
|
17
wheeler 2021-06-23 12:54:27 +08:00 via iPhone
Zen of Python 简直就是打自己脸的。
|
18
chenqh 2021-06-23 13:51:03 +08:00
感觉还是性能不行, 别说 nodejs, 连 php8 都赶不上,过几年估计 ruby 都比 py 快了
|
19
laoyur 2021-06-23 13:59:08 +08:00 1
写了几层的 if,调试问题的时候想临时注释掉条件的时候,我是崩溃的,小心翼翼地选中代码块,减 tab,完了还得选中代码块,再小心翼翼地 tab 回去
对这个场景有没有啥好办法? |
20
imn1 2021-06-23 14:10:56 +08:00 1
操作符的场景用在什么地方?
最大用途就是不同类型对象,要达到相似效果,但它们的方法名不相同,写函数需要检查一遍类型 如果忽略类型(只要求返回同类型)的可以不用检查 set | set -> set dict | dict -> dict dict.keys | dict.keys -> dict.keys set - set -> set dict.keys - dict.keys -> dict.keys/set dict.items - dict.items -> dict->items 如果不清楚传入类型,要实现两者合并,set/dict 要各写一句代码,前面还要做类型检查 另外,dict 的 | 操作符,好像之前没有相同的方法 d.update()是返回 None 的,所以还要加一句 return d.copy() 我觉得 python 容易混乱的地方,是究竟方法是修改自身(返回 None ),还是返回一个新对象 不熟悉代码 /手册的人无从判断,这些问题还带到了三方模块,例如 pandas 早期就是,现在新版 pandas 逐步在理顺,统一默认返回 new object,用了 inplace=True 就修改自身 我现在很多情况都需要靠编辑器插件查看 return hint 才能确定,不然就要去翻手册了,三方包更惨 |
22
BeautifulSoap 2021-06-23 14:19:43 +08:00
比起 python 的各种语法糖,我是真的希望 go 能稍稍加点更加便捷的语法。比如 `if 'data' in slice` 这种,这种东西虽然自己亲手给不同类型的 slice 写不同的函数也不是不行,但是能编译器直接支持下是真的体验会更好点
|
23
laike9m 2021-06-23 15:21:33 +08:00 via Android
然而每个语言都是越变越复杂的
|
24
joyhub2140 2021-06-23 16:10:08 +08:00 3
这就是 java 能大行其道的原因,JAVA 真的很适合一大伙人做大工程,没有乱七八糟的语法特性,近十年来最大的进步还是支持函数式编程,无论新手还是老师傅,都能最大限度集中在业务上面。
|
25
vicalloy 2021-06-23 16:49:51 +08:00 1
@joyhub2140 Java 的语法特性还不够多?
|
26
TypeError 2021-06-23 17:25:22 +08:00
所以好多公司 python 转 go 了
|
27
OysterQAQ 2021-06-23 17:55:39 +08:00 via iPhone
Java 程序员感觉 python 过于灵活了
|
28
lonewolfakela 2021-06-23 18:04:59 +08:00
个人感觉脚本语言要看语言的简洁性的话就完全不应该找 python……不如看看 lua 是怎么用超级简单的语法元素构建出来的
|
29
kongkongyzt 2021-06-23 19:29:00 +08:00 1
同感.
Python 现在的发展和 zen of python 感觉完全相悖了, 让我有些失望 除此以外, type hint 做的还是不够好 async 设计得也没有 Go 那么好, 当然这点表示理解 |
30
jiezhi 2021-06-23 19:38:14 +08:00 via iPhone
每次需要时间转换我都跟头疼。
|
31
dhou45 2021-06-23 20:05:42 +08:00
同意楼上说的, 过于脚本化, 只能是胶水语言缝缝补补用的, 性能拉胯慢的要死.. 现在我也不用 python 了
|
32
O5oz6z3 2021-06-23 20:32:56 +08:00
有点同感,新语法学不过来了。
不过很好奇楼主所说的“dict 本身的方法就可以容易、直观的实现”是什么?能不能给一下完整的新旧写法对比一下优劣? 想知道楼主还觉得什么语法糖很混乱 |
33
levelworm 2021-06-23 21:05:53 +08:00
所以实际工程中往往需要有 coding standards,有些东西不给用,有些东西必须用,等等。不然人多了代码量上去了,就得累死了。
|
34
levelworm 2021-06-23 21:07:07 +08:00
就我浅显的水平,对函数式的那些东西实在没啥兴趣。喜欢函数式去写 LISP 呗,非要在 C++或者 Python 里写是闹哪能。。。
|
36
chenqh 2021-06-23 22:14:04 +08:00
@lonewolfakela 别呀,想 lua 这种 list, dict 不分的语言, dict 还有空洞的语言,还是不用为好把
|
37
abcbuzhiming 2021-06-23 23:09:26 +08:00
java 属于语法糖过少的话,python 这种就明显属于过量,其实 js 这两年也有语法糖过量的趋势,语法糖过量的是会影响代码阅读,自己一个人开发无所谓,别人看你的代码就会比较痛苦
|
38
muzuiget 2021-06-24 00:19:28 +08:00
同样不喜欢各种魔法函数,除非不得不用,比如接口定死又要重新实现。不然老老实实把函数名字定义出来好。
|
39
yingbo 2021-06-24 01:08:13 +08:00
的确过量。操作符的意思没有函数名称直接好记,不应该太多。我是觉得像这种复杂的操作,还是留给函数 /方法比较好。说起过于繁杂的语法糖,其实 python 还远赶不上 scala 。Scala 我看就是到处都是“回字的六种写法”,门槛提高了还没啥太大的好处
|
40
NatsuMune 2021-06-24 03:16:24 +08:00 via iPhone
笑到最后的还是 Java
|
41
alexkkaa 2021-06-24 06:20:34 +08:00 via Android
语法糖也可以很香啊 比如 c#
个人觉得目前 go 是比较完善也简洁的语言。本身的坑很少。标准库也比较规范。 |
42
sampeng 2021-06-24 07:05:46 +08:00 via iPhone
复杂不复杂我不晓得,只知道每次写的任何 python 代码,写时一时爽,半年后维护火葬场
|
43
towser 2021-06-24 07:10:14 +08:00
语法糖过载也不是好事。
|
44
acmore 2021-06-24 07:56:16 +08:00
They say "Fxxk 'import this'".
|
45
fxjson 2021-06-24 07:59:46 +08:00 via Android
我写了 10 动态语言,隐约意识到:动态语言一时爽,代码重构火葬场
|
46
herozzm 2021-06-24 08:11:31 +08:00 via Android
真是垃圾 写的代码不忍直视
|
47
hunk 2021-06-24 08:17:49 +08:00
go 用起来贼爽,小工具尝试用 node 实现,有些库还是 py 的多。
灵活切换,总的来说能不用 py 就不用。 |
48
Cbdy 2021-06-24 08:18:44 +08:00 via Android
游标卡尺还行
|
50
zhangshine 2021-06-24 08:46:25 +08:00 2
支持我还用 python 的原因就剩下 django 了
|
51
madpecker009 2021-06-24 08:49:35 +08:00
@LokiSharp 我命油我不油天?
|
52
LokiSharp 2021-06-24 09:06:53 +08:00
@madpecker009 问题是我可以按我自己想法写,别人不会,读代码的频率比自己写代码高多了
|
54
xiaolinjia 2021-06-24 09:15:04 +08:00
a | b,不就是 {**a, **b}吗。我也觉得这个没多大意义。
a |= b,是就地修改+返回,比 a.update(b) 多一道可以返回修改后的 dict 。不过也就少些了一句,意义不大。 更多的我感觉应该是为了,让这个能支持 operator 模块,来函数式编程。 至于 import this 的信条,也不看是啥时候说的。就像我自己写的时候想着要写得简洁点,那同事不一定这么想啊,开源社区就是这样,谁都可以说句话,往里面提交些代码,但是吧,py 门槛较低,有些人吧又没那么讲究。要是龟叔独裁了一点,又要被社区的喷。 终究到底,我就希望速度能提上来,这样其他方面我也没怎么要求。 |
57
encro 2021-06-24 09:54:57 +08:00 1
1,语法糖没有错,可以让代码变得更加简练,而简练通常意味容易理解和维护;
2,而且并不会怎么影响性能(从原理上来说); 3,目前语言都趋同了,至少我知道的 Java,C#,PHP,TS,Dart,C++等,基本上大家都差不多的语法了。Go 有自己的坚持简单直接,目前看来是成功的。Rust 解决 C++的问题,目前看来也是成功的。Python 作为计算机非专业人士的编程工具,也是成功的。 Python 做做快速项目还是可以的,比如 django 搭建一个小范围用的后台,pyside 开发一个小工具,做个爬虫什么的,都是可以的。团队项目的话,还是选用一套成熟框架吧( django 虽然也很成熟好用,但是不适合个性化定制,最终成本可能大于其他框架从头来),框架最重要一点就是约定。 Python 最大的问题就是分散,解决同一个问题可能有三种方案,而三种方案可能都有严重缺陷,你如果要解决他们的缺陷,可能需要的时间比自己实现还难(因为语法随意性)。当然也因为 pip 历史悠久,也存在大量如 requests,flask,django,fastapi,NumPy,Pandas 等等比较高质量的库和封装。 如果你要做一个多人协作,长期开发和维护的项目,我觉得还是远离 Python 比较好,类型提示、丰富的类特性很重要,Python 历史遗留的库也太多了吧,我觉得升级无望,没有类型提示,在 IDE 上写代码就是自己找罪受,这方面目前 PHP,C++都好很多。 |
58
neptuno 2021-06-24 09:59:49 +08:00
java:每个人都在嘲笑我,最后每个人都会成为我
|
59
Marszm 2021-06-24 10:10:44 +08:00
python 的缩进,,简直恶心坏我了。。。其实一点都不好看,根本就是个屑。js 赛高。无自由,毋宁死。。
|
60
jingslunt 2021-06-24 10:13:23 +08:00
@chenqh 之前看到一个新闻,好像是 python 作者入职微软,打算把 python 速度大幅度提升,应该是 4.0 吧。速度上 php 都做到了
|
62
agagega 2021-06-24 10:17:23 +08:00 via iPhone
要加糖加到最后就难免变成 Ruby 的样子,一致性还没有 Ruby 高
|
63
Damenly1 2021-06-24 10:30:03 +08:00
什么?都支持 | |=这种了居然还不支持 ++
/-- 吗? |
65
ipwx 2021-06-24 11:06:44 +08:00
@encro C++ 的碎片化更严重一点。。。
用 C++ 的话,团队得严格规定写法和用的类库,而且团队成员素质要求很高,要不然就肯定推进不下去。但是如果是大神组成的小团队,C++ 真的是人挡杀人,佛挡杀佛,Java 根本难望其项背。 |
66
shyling 2021-06-24 11:15:05 +08:00
py 是有点乱。。。ruby 糖那么多一致性好多了
|
68
encro 2021-06-24 12:59:46 +08:00
@ipwx
C++只是最近才开始边学边用, 直接看谷歌浏览器源码,都是 c++11 以上的,看起来还好, 使用使用底层 windows api 的,各种结构体,数据类型,指针,需要一个强大大脑和经验积累,还需要对着文档开发,做起来累。 感觉 C++11 以后的编程风格,其实可以和 JAVA,C#也没太大差别了,反而多了模板,标准库等等,开发效率和灵活性提高了,再加上能做的事更多,所以个人觉得目前也可以学学吧。 刚上手 C++,且只是偶尔用用,非专职,观点不一定对。 |
69
abersheeran 2021-06-24 13:56:22 +08:00
|
70
ipwx 2021-06-24 14:00:48 +08:00
@abersheeran 确实如此。一些普通前端程序员,写代码就是糊表匠的那种,C++ 项目分分钟 segmentation fault 还调试不了。
|
71
abersheeran 2021-06-24 14:02:26 +08:00
@ipwx 别提了。至今还有人写出内存泄露的 JavaScript 代码怪 Node.js 问题大呢。笑死🤣
|
72
chenqh 2021-06-24 14:05:54 +08:00
反正 golang 在我看来最主要的有点就是性能和直接 2 进制了, 如果做 web 的话,2 进制可能没有那么大的必要, 毕竟服务器你要配置 mysql, nginx, supervisor 或者 docker 为什么不能顺便配置一下语言环境
|