有没有觉得, Python 这个语言,越来越复杂(繁杂)了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
piqizhu8
V2EX    问与答

有没有觉得, Python 这个语言,越来越复杂(繁杂)了

  •  2
     
  •   piqizhu8 2021-06-23 10:58:53 +08:00 8536 次点击
    这是一个创建于 1620 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近一段时间,我都在研究编程语言,因为我也想创造一个编程语言, 不过我目前主要用的是 Python


    在我看来,一门语言应该减少歧义,语言内要减少分裂

    但我发现 Python 越来越复杂了,语法糖越来越多了, 比如:

    3.9 版新增的 合并 dict 的操作符 | |=

    这 2 个操作符实现的功能,dict 本身的方法就可以容易、直观的实现

    增加这 2 个操作符 虽然可以少打几个字, 但是 这样不断的堆砌语法糖, 未来会让这个语言很混乱,

    我个人目前没有发现这 2 个操作符带来了多大的价值,有些弊大于利

    想问问大家的看法

    72 条回复    2021-06-24 14:05:54 +08:00
    kkocdko
        1
    kkocdko  
       2021-06-23 11:01:46 +08:00
    我也这么觉得,再结合一下上次说要优化性能的帖子,感觉似乎有点冲突,不知道这些语法会不会成为性能优化的障碍。
    我可能会更关注性能。
    LokiSharp
        2
    LokiSharp  
       2021-06-23 11:06:25 +08:00   5
    Ptyhon 的语法一直很垃圾,复杂繁琐。完全和它的设计理念相悖。详见油腻的 Ptyhon ( Fluent Python )
    233373
        3
    233373  
       2021-06-23 11:08:02 +08:00   1
    魔法师太多了- - 。
    Dockerfile
        4
    Dockerfile  
       2021-06-23 11:12:36 +08:00
    看别人的 python 项目比较痛苦
    glfpes
        5
    glfpes  
       2021-06-23 11:23:05 +08:00
    我认为语法糖不是好的设计,简洁不在于键盘敲的少,而是设计上应该简介,相似的东西应该规约。
    echo1937
        6
    echo1937  
       2021-06-23 11:29:00 +08:00
    @Jwyt #4 这个看法我是同意的,我一直也在思考,这种痛苦更多来自于动态语言的通病,还是 Python 自身的问题。

    而且,Python is defined by its implementation,他没有 Specification,感觉加新特性很随意,某些时候缺少通盘考虑。
    simple2025
        7
    simple2025  
       2021-06-23 11:30:36 +08:00
    我只希望 py 的速度有 nodejs 那么快
    Kilerd
        8
    Kilerd  
       2021-06-23 11:39:31 +08:00 via iPhone
    来,我们一起骂海象操作符 :=
    huang119412
        9
    huang119412  
       2021-06-23 11:41:18 +08:00
    好的设计都是趋同的,go 不需要泛型,最后变真香。这样看还是 Java 好,繁琐不繁琐意义不大,又不是白板编程,毕竟现在都是智能的 ide 。
    BingoXuan
        10
    BingoXuan  
       2021-06-23 11:52:18 +08:00 via Android
    语法糖早就已经够用了。性能不行就算了,匿名函数不够也忍了,但加 type hints 后都几个版本了,还是类型系统还是半吊子。
    lujjjh
        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 也挺直观的,所以我觉得这个特性还不错,至少比 := 的争议要少多了。
    keepeye
        12
    keepeye  
       2021-06-23 12:04:52 +08:00
    我用 python 写出来的代码真丑,代码多一些,ide 都要卡半天
    keepeye
        13
    keepeye  
       2021-06-23 12:05:25 +08:00
    感觉 python 写的时候很爽,读的时候很糟心
    WilliamYang
        14
    WilliamYang  
       2021-06-23 12:25:56 +08:00
    @keepeye 同感,现在再好的 Python 代码,看起来还是很丑,相比于 Go
    lujjjh
        15
    lujjjh  
       2021-06-23 12:29:11 +08:00
    FIY: /t/785258 刚好看见隔壁的场景适合用这个特性
    hxys
        16
    hxys  
       2021-06-23 12:30:01 +08:00
    确实,过于脚本化,过于简单有时候反而人类难看懂
    wheeler
        17
    wheeler  
       2021-06-23 12:54:27 +08:00 via iPhone
    Zen of Python 简直就是打自己脸的。
    simple2025
        18
    simple2025  
       2021-06-23 13:51:03 +08:00
    感觉还是性能不行, 别说 nodejs, 连 php8 都赶不上,过几年估计 ruby 都比 py 快了
    laoyur
        19
    laoyur  
       2021-06-23 13:59:08 +08:00   1
    写了几层的 if,调试问题的时候想临时注释掉条件的时候,我是崩溃的,小心翼翼地选中代码块,减 tab,完了还得选中代码块,再小心翼翼地 tab 回去
    对这个场景有没有啥好办法?
    imn1
        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 才能确定,不然就要去翻手册了,三方包更惨
    simple2025
        21
    simple2025  
       2021-06-23 14:11:17 +08:00   1
    @laoyur 在 `if ` 加个 `1 == 2` 不就好了码?
    BeautifulSoap
        22
    BeautifulSoap  
       2021-06-23 14:19:43 +08:00
    比起 python 的各种语法糖,我是真的希望 go 能稍稍加点更加便捷的语法。比如 `if 'data' in slice` 这种,这种东西虽然自己亲手给不同类型的 slice 写不同的函数也不是不行,但是能编译器直接支持下是真的体验会更好点
    laike9m
        23
    laike9m  
       2021-06-23 15:21:33 +08:00 via Android
    然而每个语言都是越变越复杂的
    nxforce
        24
    nxforce  
       2021-06-23 16:10:08 +08:00   3
    这就是 java 能大行其道的原因,JAVA 真的很适合一大伙人做大工程,没有乱七八糟的语法特性,近十年来最大的进步还是支持函数式编程,无论新手还是老师傅,都能最大限度集中在业务上面。
    vicalloy
        25
    vicalloy  
       2021-06-23 16:49:51 +08:00   1
    @joyhub2140 Java 的语法特性还不够多?
    TypeError
        26
    TypeError  
       2021-06-23 17:25:22 +08:00
    所以好多公司 python 转 go 了
    OysterQAQ
        27
    OysterQAQ  
       2021-06-23 17:55:39 +08:00 via iPhone
    Java 程序员感觉 python 过于灵活了
    lonewolfakela
        28
    lonewolfakela  
       2021-06-23 18:04:59 +08:00
    个人感觉脚本语言要看语言的简洁性的话就完全不应该找 python……不如看看 lua 是怎么用超级简单的语法元素构建出来的
    kongkongyzt
        29
    kongkongyzt  
       2021-06-23 19:29:00 +08:00   1
    同感.
    Python 现在的发展和 zen of python 感觉完全相悖了, 让我有些失望
    除此以外, type hint 做的还是不够好
    async 设计得也没有 Go 那么好, 当然这点表示理解
    jiezhi
        30
    jiezhi  
       2021-06-23 19:38:14 +08:00 via iPhone
    每次需要时间转换我都跟头疼。
    dhou45
        31
    dhou45  
       2021-06-23 20:05:42 +08:00
    同意楼上说的, 过于脚本化, 只能是胶水语言缝缝补补用的, 性能拉胯慢的要死.. 现在我也不用 python 了
    O5oz6z3
        32
    O5oz6z3  
       2021-06-23 20:32:56 +08:00
    有点同感,新语法学不过来了。
    不过很好奇楼主所说的“dict 本身的方法就可以容易、直观的实现”是什么?能不能给一下完整的新旧写法对比一下优劣?
    想知道楼主还觉得什么语法糖很混乱
    levelworm
        33
    levelworm  
       2021-06-23 21:05:53 +08:00
    所以实际工程中往往需要有 coding standards,有些东西不给用,有些东西必须用,等等。不然人多了代码量上去了,就得累死了。
    levelworm
        34
    levelworm  
       2021-06-23 21:07:07 +08:00
    就我浅显的水平,对函数式的那些东西实在没啥兴趣。喜欢函数式去写 LISP 呗,非要在 C++或者 Python 里写是闹哪能。。。
    simple2025
        35
    simple2025  
       2021-06-23 22:13:12 +08:00
    @TypeError py 转 golang 基本都是因为性能,
    simple2025
        36
    simple2025  
       2021-06-23 22:14:04 +08:00
    @lonewolfakela 别呀,想 lua 这种 list, dict 不分的语言, dict 还有空洞的语言,还是不用为好把
    abcbuzhiming
        37
    abcbuzhiming  
       2021-06-23 23:09:26 +08:00
    java 属于语法糖过少的话,python 这种就明显属于过量,其实 js 这两年也有语法糖过量的趋势,语法糖过量的是会影响代码阅读,自己一个人开发无所谓,别人看你的代码就会比较痛苦
    muzuiget
        38
    muzuiget  
       2021-06-24 00:19:28 +08:00
    同样不喜欢各种魔法函数,除非不得不用,比如接口定死又要重新实现。不然老老实实把函数名字定义出来好。
    yingbo
        39
    yingbo  
       2021-06-24 01:08:13 +08:00
    的确过量。操作符的意思没有函数名称直接好记,不应该太多。我是觉得像这种复杂的操作,还是留给函数 /方法比较好。说起过于繁杂的语法糖,其实 python 还远赶不上 scala 。Scala 我看就是到处都是“回字的六种写法”,门槛提高了还没啥太大的好处
    NatsuMune
        40
    NatsuMune  
       2021-06-24 03:16:24 +08:00 via iPhone
    笑到最后的还是 Java
    alexkkaa
        41
    alexkkaa  
       2021-06-24 06:20:34 +08:00 via Android
    语法糖也可以很香啊 比如 c#

    个人觉得目前 go 是比较完善也简洁的语言。本身的坑很少。标准库也比较规范。
    sampeng
        42
    sampeng  
       2021-06-24 07:05:46 +08:00 via iPhone
    复杂不复杂我不晓得,只知道每次写的任何 python 代码,写时一时爽,半年后维护火葬场
    towser
        43
    towser  
       2021-06-24 07:10:14 +08:00
    语法糖过载也不是好事。
    acmore
        44
    acmore  
       2021-06-24 07:56:16 +08:00
    They say "Fxxk 'import this'".
    fxjson
        45
    fxjson  
       2021-06-24 07:59:46 +08:00 via Android
    我写了 10 动态语言,隐约意识到:动态语言一时爽,代码重构火葬场
    herozzm
        46
    herozzm  
       2021-06-24 08:11:31 +08:00 via Android
    真是垃圾 写的代码不忍直视
    hunk
        47
    hunk  
       2021-06-24 08:17:49 +08:00
    go 用起来贼爽,小工具尝试用 node 实现,有些库还是 py 的多。
    灵活切换,总的来说能不用 py 就不用。
    Cbdy
        48
    Cbdy  
       2021-06-24 08:18:44 +08:00 via Android
    游标卡尺还行
    wms
        49
    wms  
       2021-06-24 08:40:00 +08:00
    @laoyur if true or expr
    zhangshine
        50
    zhangshine  
       2021-06-24 08:46:25 +08:00   2
    支持我还用 python 的原因就剩下 django 了
    madpecker009
        51
    madpecker009  
       2021-06-24 08:49:35 +08:00
    @LokiSharp 我命油我不油天?
    LokiSharp
        52
    LokiSharp  
       2021-06-24 09:06:53 +08:00
    @madpecker009 问题是我可以按我自己想法写,别人不会,读代码的频率比自己写代码高多了
    wellsc
        53
    wellsc  
       2021-06-24 09:13:57 +08:00
    @LokiSharp 怎么做到一个单词拼错两次的
    xiaolinjia
        54
    xiaolinjia  
       2021-06-24 09:15:04 +08:00
    a | b,不就是 {**a, **b}吗。我也觉得这个没多大意义。
    a |= b,是就地修改+返回,比 a.update(b) 多一道可以返回修改后的 dict 。不过也就少些了一句,意义不大。
    更多的我感觉应该是为了,让这个能支持 operator 模块,来函数式编程。

    至于 import this 的信条,也不看是啥时候说的。就像我自己写的时候想着要写得简洁点,那同事不一定这么想啊,开源社区就是这样,谁都可以说句话,往里面提交些代码,但是吧,py 门槛较低,有些人吧又没那么讲究。要是龟叔独裁了一点,又要被社区的喷。

    终究到底,我就希望速度能提上来,这样其他方面我也没怎么要求。
    wellsc
        55
    wellsc  
       2021-06-24 09:15:48 +08:00
    @alexkkaa Go 的标准库规范吗?去看看 time 包吧
    LokiSharp
        56
    LokiSharp  
       2021-06-24 09:39:29 +08:00
    @wellsc 公司的蓝牙键盘有点问题= =
    encro
        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++都好很多。
    neptuno
        58
    neptuno  
       2021-06-24 09:59:49 +08:00
    java:每个人都在嘲笑我,最后每个人都会成为我
    Marszm
        59
    Marszm  
       2021-06-24 10:10:44 +08:00
    python 的缩进,,简直恶心坏我了。。。其实一点都不好看,根本就是个屑。js 赛高。无自由,毋宁死。。
    jingslunt
        60
    jingslunt  
       2021-06-24 10:13:23 +08:00
    @chenqh 之前看到一个新闻,好像是 python 作者入职微软,打算把 python 速度大幅度提升,应该是 4.0 吧。速度上 php 都做到了
    jingslunt
        61
    jingslunt  
       2021-06-24 10:13:54 +08:00
    @neptuno 哈哈哈
    agagega
        62
    agagega  
       2021-06-24 10:17:23 +08:00 via iPhone
    要加糖加到最后就难免变成 Ruby 的样子,一致性还没有 Ruby 高
    Damenly1
        63
    Damenly1  
       2021-06-24 10:30:03 +08:00
    什么?都支持 | |=这种了居然还不支持 ++
    /-- 吗?
    hsfzxjy
        64
    hsfzxjy  
       2021-06-24 11:02:41 +08:00 via Android
    @jingslunt 是 3.11 ,有个大佬在牵头
    ipwx
        65
    ipwx  
       2021-06-24 11:06:44 +08:00
    @encro C++ 的碎片化更严重一点。。。

    用 C++ 的话,团队得严格规定写法和用的类库,而且团队成员素质要求很高,要不然就肯定推进不下去。但是如果是大神组成的小团队,C++ 真的是人挡杀人,佛挡杀佛,Java 根本难望其项背。
    shyling
        66
    shyling  
       2021-06-24 11:15:05 +08:00
    py 是有点乱。。。ruby 糖那么多一致性好多了
    simple2025
        67
    simple2025  
       2021-06-24 11:32:36 +08:00
    @encro golang 是 gc 语言里面的直接支持编译成 2 进制的, 成功正常呀
    encro
        68
    encro  
       2021-06-24 12:59:46 +08:00
    @ipwx

    C++只是最近才开始边学边用,
    直接看谷歌浏览器源码,都是 c++11 以上的,看起来还好,
    使用使用底层 windows api 的,各种结构体,数据类型,指针,需要一个强大大脑和经验积累,还需要对着文档开发,做起来累。

    感觉 C++11 以后的编程风格,其实可以和 JAVA,C#也没太大差别了,反而多了模板,标准库等等,开发效率和灵活性提高了,再加上能做的事更多,所以个人觉得目前也可以学学吧。

    刚上手 C++,且只是偶尔用用,非专职,观点不一定对。
    abersheeran
        69
    abersheeran  
       2021-06-24 13:56:22 +08:00
    @ipwx C++ 下限很低,上限很高。如果真是一群代码品味一样的大神干活,C++ 应该是最好的语言。

    但对于一般团队来说,Java 和 Golang 可能更适合一些。
    ipwx
        70
    ipwx  
       2021-06-24 14:00:48 +08:00
    @abersheeran 确实如此。一些普通前端程序员,写代码就是糊表匠的那种,C++ 项目分分钟 segmentation fault 还调试不了。
    abersheeran
        71
    abersheeran  
       2021-06-24 14:02:26 +08:00
    @ipwx 别提了。至今还有人写出内存泄露的 Javascript 代码怪 Node.js 问题大呢。笑死
    simple2025
        72
    simple2025  
       2021-06-24 14:05:54 +08:00
    反正 golang 在我看来最主要的有点就是性能和直接 2 进制了, 如果做 web 的话,2 进制可能没有那么大的必要, 毕竟服务器你要配置 mysql, nginx, supervisor 或者 docker 为什么不能顺便配置一下语言环境
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     821 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 20:27 PVG 04:27 LAX 12:27 JFK 15:27
    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