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

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

  •  2
     
  •   piqizhu8 · 117 天前 · 5509 次点击
    这是一个创建于 117 天前的主题,其中的信息可能已经有所发展或是发生改变。

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


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

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

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

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

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

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

    想问问大家的看法

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

    而且,Python is defined by its implementation,他没有 Specification,感觉加新特性很随意,某些时候缺少通盘考虑。
    chenqh
        7
    chenqh   117 天前
    我只希望 py 的速度有 nodejs 那么快
    Kilerd
        8
    Kilerd   117 天前 via iPhone
    来,我们一起骂海象操作符 :=
    huang119412
        9
    huang119412   117 天前
    好的设计都是趋同的,go 不需要泛型,最后变真香。这样看还是 Java 好,繁琐不繁琐意义不大,又不是白板编程,毕竟现在都是智能的 ide 。
    BingoXuan
        10
    BingoXuan   117 天前 via Android
    语法糖早就已经够用了。性能不行就算了,匿名函数不够強也忍了,但加 type hints 后都几个版本了,还是类型系统还是半吊子。
    lujjjh
        11
    lujjjh   117 天前   ❤️ 1
    https://www.python.org/dev/peps/pep-0584/#motivation
    不怎么写 Python,看了 motivation 觉得没什么问题,解释了现有的方法有什么不足。Python 本来就吸收了很多函数式的东西,这个特性跟 Python 也挺搭的。

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

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

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

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

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

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

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

    刚上手 C++,且只是偶尔用用,非专职,观点不一定对。
    abersheeran
        69
    abersheeran   116 天前
    @ipwx C++ 下限很低,上限很高。如果真是一群代码品味一样的大神干活,C++ 应该是最好的语言。

    但对于一般团队来说,Java 和 Golang 可能更适合一些。
    ipwx
        70
    ipwx   116 天前
    @abersheeran 确实如此。一些普通前端程序员,写代码就是糊表匠的那种,C++ 项目分分钟 segmentation fault 还调试不了。
    abersheeran
        71
    abersheeran   116 天前
    @ipwx 别提了。至今还有人写出内存泄露的 JavaScript 代码怪 Node.js 问题大呢。笑死🤣
    chenqh
        72
    chenqh   116 天前
    反正 golang 在我看来最主要的有点就是性能和直接 2 进制了, 如果做 web 的话,2 进制可能没有那么大的必要, 毕竟服务器你要配置 mysql, nginx, supervisor 或者 docker 为什么不能顺便配置一下语言环境
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2421 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 14:28 · PVG 22:28 · LAX 07:28 · JFK 10:28
    ♥ Do have faith in what you're doing.