Python 之父谈缩进和大括号 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ACMCoder
V2EX    Python

Python 之父谈缩进和大括号

  •  1
     
  •   ACMCoder 2022-11-28 12:03:31 +08:00 5486 次点击
    这是一个创建于 1124 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果回到过去,他还是会采用缩进而不是大括号吗?
    视频地址: https://www.bilibili.com/video/BV1KG4y157ha/
    25 条回复    2022-12-14 07:47:31 +08:00
    Radom
        1
    Radom  
       2022-11-28 15:02:19 +08:00
    不得不承认,他技术比我好,长的比我帅
    lookStupiToForce
        2
    lookStupiToForce  
       2022-11-28 15:43:22 +08:00
    省流:Van Rossum 没直接回答题述问题,但提到了编程新手在学习和使用 python 时只用缩进能让他们更加快地融入后续语言各要素的学习中,所以他应该还是会选择只用缩进(当然你可以当我这是个人解读)

    另外代码缩进真的是个好习惯。
    不限于代码,文本缩进也是个好习惯。
    所以我现在特别反感 markdown 的一点在于,只有用嵌套列表实现的缩进,没有自然而然的其他语法去实现缩进,比如 4 个空格
    &uggggglllyyyyyyy 甭提这种要在文本前插入大串 html 空白字符的丑陋行径了
    &uggggglllyyyyyyy 试问谁受得了自己的要输入的话可能还没空白字符占的位多?
    Purelove
        3
    Purelove  
       2022-11-28 18:19:56 +08:00
    我也觉得缩进挺优雅的
    ikidou     4
    ikidou  
       2022-11-28 20:46:41 +08:00 via Android
    就是 if 这种 后面还有代码就很难受,可能是还没习惯吧,之前都是写 shell 脚本,最近刚开始接触 python, 就是没有大括号难受
    Kylin30
        5
    Kylin30  
       2022-11-28 21:07:07 +08:00
    最好是共存,方便格式化。
    wizardyhnr
        6
    wizardyhnr  
       2022-11-29 10:54:42 +08:00
    当时学 Python 的时候还就是看中了它没有括号的语法。真是萝卜青菜各有所爱。
    yuyang
        7
    yuyang  
       2022-11-29 13:08:52 +08:00
    无论怎么洗,缩进都是个烂设计,代码块的末尾需要一个结束标志,你不喜欢大括号,你可以搞个 end 之类的东西,python 这样搞 auto format 就全失效了,python 的很多设计今天看来不咋滴,比如它把变量的声明和赋值搅到一起也是个不好的设计。
    AV1
        8
    AV1  
       2022-11-29 14:41:51 +08:00
    缩进应该是格式化工具帮人做的事,不应该由人来手工缩进。
    raysonlu
        9
    raysonlu  
       2022-11-29 15:58:06 +08:00
    我觉得缩进应该尽量用于“美化代码”,而尽量不要并且最好干脆不要参与“语法结构定义”的逻辑里。
    lijiangang886
        10
    lijiangang886  
       2022-11-29 18:02:16 +08:00
    省流:顾左右而言他,打了十一分钟的太极
    youdoit
        11
    youdoit  
       2022-11-29 18:32:36 +08:00
    缩进是 yaml 一样垃圾的东西
    magicdawn
        12
    magicdawn  
       2022-11-29 20:07:10 +08:00
    视频中说已经使用括号表示 dict, 没法回头. 那 js 也是大括号表示 object,
    在不通的语句下有不同的含义吧.

    可行的办法: 新的文件后缀
    参考 sass 生态中的 .sass .scss, 本来是基于缩进, 新扩展名支持括号
    magicdawn
        13
    magicdawn  
       2022-11-29 20:12:27 +08:00
    rozbo
        14
    rozbo  
       2022-11-29 21:59:47 +08:00
    c++ 出身的, 因为一直习惯不了这个缩进,实在是能不用 py 就不用,如果有一天能共存,我一定高举双手奔走呼告
    LindsayZhou
        15
    LindsayZhou  
       2022-11-29 22:00:05 +08:00   1
    我觉得差不多,缩进改成大括号并不能让我的代码变得更漂亮。
    我 Golang 的大括号,Python 的缩进都用,都察觉不出什么太大的阻碍或难看。
    我写 Py 的时间比 Go 长,所以觉得我的 Py 写得比 Go 漂亮一点吧。
    FrankHB
        16
    FrankHB  
       2022-11-30 06:56:41 +08:00
    复制粘贴一遍回复:

    除非你只用一个空格,缩进用空格就是逻辑上扯蛋的,总是无法避免在源文件编码层次上允许光标卡进缩进内部出现“半个缩进”的破坏不变量奇葩状态,跟 malloc 到处乱飞找不到 free 的破烂代码本质上是同种的可恶。顺带还没事 bloat 一下源代码。
    虽然(水平)制表符在语义上也不那么适合缩进,但至少没这种低级问题,在许多语言的基本字符集内也没别的得选的。于是高下立判。
    注意在根本上,前缀空格干的活是对齐。虽然缩进可以提示对齐,插入缩进跟缩进的理由逻辑上完全是两码事。
    至于可读性,py 式缩进直接干掉了 free form 语法允许具有的上下文无关性,分析这坨玩意儿现实就没法只是 parser 的事(想用 parser 做对会极其扭曲),基本只能加语义预处理,又是个不适合机器又不适合熟练的人类阅读者的奇葩设计,纯属没事找事的自以为是了。另一方面,无法局部调整缩进导致传统纸质书那样的分页排版在换页处的可读性极其看脸,一不小心跨页就得数缩进,怎么看都比用括号直接从视觉上显式辅助定位恶心得多。
    相对来说,写起来可能还能用 IDE 和结构化编辑器(现在还基本是空气)解决,没读起来那么严重。但是要把这个混淆成可读性,心智多少有些问题。

    @youdoit yaml 的垃圾程度比缩进大得多。
    @rozbo 共存?试试 Haskell ?
    在你显然对被迫记忆上下文相关的缩进的语义(虽然技术上被钦定为语法)没什么经验的时候,姑且还是给你一些反悔的机会吧。
    KENNHI
        17
    KENNHI  
       2022-11-30 11:41:12 +08:00 via Android
    @FrankHB 无所谓,IDE 会帮我。而且我觉得 Python 代码本身写起来很舒服
    而就像 js ,就算有大括号写起来还是和吃屎一样难受
    FrankHB
        18
    FrankHB  
       2022-11-30 13:52:07 +08:00
    @KENNH 复制的最后一段就是怼借口有 IDE 拉屎恶心读者的。何必凑上来对号入座呢?真要 write-only 舒服怎么不 Perl ?连 IDE 都无关紧要了。
    (虽然 py 的 IDE 其实历来不怎么样,不过这里是次要的。)
    adoal
        19
    adoal  
       2022-11-30 14:17:31 +08:00   3
    用缩进表示作用域层次的语言有不少,之所以 Python 会经常因为这事被拿出来说,还不是因为太流行了,阿猫阿狗都觉得自己能指点 Python
    FrankHB
        20
    FrankHB  
       2022-11-30 14:20:09 +08:00
    既然可读性有没有所谓都会成问题,再提个更一般的现象好了。

    其实平心而论,只有 py 式缩进实际并不会浪费我多少阅读源代码的时间,毕竟就算真的要做 semantic transformation 也完全是 one-pass 的,比 Lisp 宏都省事多了(不过 Lisp 宏我真不用傻乎乎去这么理解)。
    关键问题是,隐含一个前提:我得假定我看的代码(至少在语法上)是对的。
    尽管搞错缩进实在是很低级的问题,以至于这个假设绝大部分时候并不会被违反,存在这个假设本身就令我相当不爽。并且这种罕见性的低效用直接导致了不爽的升级。
    因为为了一个实际罕见的低级错误分支,我不得不在脑子里准备 fallback path ,继续跟 cache locality 过不去。
    ( Haskell 也有类似的问题,而且因为对一些上下文混用空白符的检查的缺乏,后果更严重,却反而导致了罕见性的弱化,某种意义上反而没那么恶心了看,你学了这么多旮旯,也不是用不上嘛。而这类严重后果在 Python ,或者至少是鼓吹了 PEP-8 以后的 Python 中,并不那么显见。)

    类似的强迫劣化人脑中语言实现的问题其实很普遍,不是 py 专利。
    比如说 C 的声明符语法就被我认为是垃圾设计,除了人和机器的正确实现都麻烦而实际技术好处基本就是省纸这么个可笑的投入产出比(也是低效用的实例)外,它还暗示读者除了理解正确的语法规则,最好需要掌握次等的小聪明所谓“右左法则”才能去跟那些学得不到家(不知道正经的声明的形式语法)的 C 用户。这让交流更加困难不说,还嘲讽了正经学习语言规则的用户是傻子。
    这里有个类似的罕见性技术细节:所谓右左法则其实绝大多数情况下是形式上正确的,能得到正确的分析结果。但是它依赖读者事先知道什么标识符未被声明,这是一个全局(至少一个翻译单元)的语义性质。于是为了保证正确,我不得不准备两套思路,脑补实现比编译器更复杂的算法以便回溯出错误时,能和那些不懂形式语法的半吊子用户沟通。而编译器根本不需要鸟这套,照着正式的文法产生式直接实现 parser 就能几乎完全处理所有情况。(几乎是指 C 的文法设计上下文相关的例外,这是另外的糟粕。)
    如果抛开罕见性,那么所谓的右左法则和谭浩强之流其实本质没什么区别,都是应当纯粹被鄙视的:鼓励放着正经规则不学,非得去做二道贩子,然后粉饰虚假的“简单”诱骗更多 noob 上当,搞烂整个用户群体。

    Py 在这里有点不同就在于形式上由设计者背书,所以不会导致 py 意义上的技术错误。
    但是当大量用户依赖 py 入门正经编程甚至理论计算机科学基础的时候,用户会不自觉地试图把 py 的局限性迁移到其它语言上照猫画虎,结果污染的远不只是 py 用户这个群体。
    这个客观现象导致我即便无所谓 py 的设计和个别人的口味,也不得不面对这些不论是有意还是无意强迫我把智商下限拉低才配和他们交流的敌人了。
    (虽然其实这里有资格到我需要特地婊的大约只有 MIT 的 6.01 。GvR 这种连个 PTC 都要 feel educated 的实在不配。)
    KENNHI
        21
    KENNHI  
       2022-11-30 17:23:37 +08:00 via Android
    @FrankHB 正是因为有 IDE 所以无所谓啊,而且不想用可以不用嘛,Python 的替代品可太多了,另外我主要用 java 。不像 js 那个属于不想吃屎也得吃,所以我逮着机会就要骂。
    krixaar
        22
    krixaar  
       2022-11-30 17:40:21 +08:00
    @yuyang #7 然后 VB 这种 If 后面还要加 Then 最后要 End 的又被骂成 too verbose ,众口是真的难调。
    billccn
        23
    billccn  
       2022-11-30 21:17:16 +08:00   1
    用缩进实现语法结构其实有一个巨大的隐性问题:git 合并分支的时候可能会让代码出错。原因是很多不是专门写 Python 的人都会在 PR 工具或者 git 里面设置忽略空白的变化,这样在 merge/rebase 的时候如果两个分支缩进产生了分歧是看不到的。这个在大括号语言里完全没有影响,最多就是格式破坏了,到 Python 里面代码就变成不能跑甚至语义变了。

    现在越来越多 C/C++库带 Python 写的外壳或者测试,所以这个问题会越来越多。
    FrankHB
        24
    FrankHB  
       2022-12-01 20:07:52 +08:00
    @KENNHI 你是写舒服了,但你也该想想你写的不是一次性 shell 面条代码,读者凭什么要就受到你随心所欲的鸟气?
    特别是这种可读性问题中的绝大部分本应能避免,至少在语言设计者面前毫无技术难度。那么非得设计成跟读者体验过不去,就是自以为是地作恶了。
    而且你得知道你花相近的时间精力同样写得舒服的不同语言的代码,读者被坑的程度不都是一样的,所以自然应当有针对性批判来区分语言在这里的好坏,不是有什么变通就能无所谓了。
    至于 js 那种读写都呵呵的就算了。
    另外,Java 是明显的脱离 IDE 虽然不是不能写但写起来体验扭曲的语言(一些地方废话实在太多)的极端代表。这是另一个不务正业的问题:逃避语言自身的设计对可用性和易用性的提升,甩锅给外部工具。
    须知,IDE 的初衷是帮助提升不同开发产出形式的不同工具之间的集成效率,而不是给你语言自身特性设计不足来擦屁股用的。Java 在用不用 IDE 的体验上造成了离谱的用户体验分裂,这点就够让人质疑当正经的通用高级编程语言的资格。(要是再极端下去,就易语言那种非得用 IDE 画表格算了……)
    chinesehuazhou
        25
    chinesehuazhou  
       2022-12-14 07:47:31 +08:00 via Android
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3947 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 05:23 PVG 13:23 LAX 21:23 JFK 00:23
    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