V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
piqizhu8
V2EX  ›  问与答

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

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

    最近一段时间,我都在研究编程语言,因为我也想创造一个编程语言, 不过我目前主要用的是 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
    魔法师太多了- - 。
    Jwyt
        4
    Jwyt  
       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,感觉加新特性很随意,某些时候缺少通盘考虑。
    chenqh
        7
    chenqh  
       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 简直就是打自己脸的。
    chenqh
        18
    chenqh  
       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 才能确定,不然就要去翻手册了,三方包更惨
    chenqh
        21
    chenqh  
       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
    然而每个语言都是越变越复杂的
    joyhub2140
        24
    joyhub2140  
       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 里写是闹哪能。。。
    chenqh
        35
    chenqh  
       2021-06-23 22:13:12 +08:00
    @TypeError py 转 golang 基本都是因为性能,
    chenqh
        36
    chenqh  
       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 糖那么多一致性好多了
    chenqh
        67
    chenqh  
       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 问题大呢。笑死🤣
    chenqh
        72
    chenqh  
       2021-06-24 14:05:54 +08:00
    反正 golang 在我看来最主要的有点就是性能和直接 2 进制了, 如果做 web 的话,2 进制可能没有那么大的必要, 毕竟服务器你要配置 mysql, nginx, supervisor 或者 docker 为什么不能顺便配置一下语言环境
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5507 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 01:32 · PVG 09:32 · LAX 17:32 · JFK 20:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.