前些天,我写了《Python为什么使用缩进来划分代码块?》,文中详细梳理了 Python 采用缩进语法的 8 大原因。我极其喜欢这种简洁优雅的风格,所以对它赞美有加。

然而文章发出去后,非常意外,竟收到了大量的反对意见!!(以往文章的互动不多,此次创下了记录)

我就不截图了,先摘录几则最刺眼的评论:

最大的缺陷就是这个缩进机制

去掉花括号是最愚蠢的设计

绝对是过度设计了,缺陷很大

最大的缺点就是缩进,太反人类了

……

对于这一类的评论,我认为他们是“睁着眼睛说瞎话”,颠倒是非黑白。Python 的缩进语法如此简洁好用,怎么就“过度设计/愚蠢/缺陷/反人类”了?

常言道众口难调,有人爱甜粽子有人爱咸粽子,但是对于咸甜味道,大家是有所共识的,不至于感官紊乱,大放厥词。

还有比较多的评论,认为缩进容易造成混乱:

代码多了,自己看着累,别人更难懂

眼花了,还是括号好些

还是{}或end更清晰

没有花括号老觉得没有安全感

缩进层次看不清楚

没有大括号不便于阅读

层次一多看起来很乱,不知哪层是哪层,要缩多少。到底退出循环没有。

看着明明缩进是对的,但运行时总是报错

用python写上十万行试试,到时候你就知道,什么叫混乱看不下去

……

现在主流的 IDE 工具都很强大,应该善于使用其基本功能,例如:设置显示空格字符、设置 tab 自动转化为空格、设置 tab 键为 4 个空格……同一层级的缩进还会有浅浅的竖线,在视觉上辅助阅读。

至于说层次过多、代码很长的情况,这本身就是一种代码坏味道!当出现过长的函数或者类时,优秀的程序员 第一时间该考虑的就是重构。推荐一本书《重构:改善既有代码的设计》,里面有正道的价值观和详尽的方法论。

还有说点击右括号,可以看到匹配的左括号,会清晰。有这东西确实不错,但没有,我并不诉求。本身紧凑简洁的代码,缩进阅读会很快。

除了以上两大类的评论,我还收到以下几种比较有代表性的评论:

  • 有人说“取消花括号会大大降低运行速度”、“这个特性鲁棒性太低了”。——这纯粹是臆想,让他们给出论证和例子,无果。别以为在哪里看到有人说 Python 慢,就想当然把锅扣到缩进的头上。
  • 有人说“多人协同编辑时,有人用tab,有人用空格”。——我说开发团队应该统一规范,然后用 autopep8 之类的辅助工具。他说规范要不停花精力维护,要花成本。拜托!这年头还有人不重视代码规范,直接开除“猿籍”。
  • 有人说“缩进没办法自动格式化代码”。——这在复制移动代码,或者要改变代码层级时,有此诉求。我一直用比较笨的方法调节(tab、shift+tab、加减空格),确实是比较笨,但是会比较有把握。刚在 PyCharm 里研究了一下,我发现它是支持自动格式化的,只是有个小小的问题要注意!

关于缩进的自动格式化,这里有两个例子,给大家演示一下:

上述例子,删除掉那行 if 条件语句,然后直接”ctrl+alt+l“作全局格式化,格式会出错。我们希望两句 print 向左缩进 4 格,但是 return 那句也会向左缩进。

在删除 if 那行后,如果我们只选中两行 print,作局部”ctrl+alt+l“格式化,那只有这两行会缩进,就没问题。

再看第二个例子,我们复制了一段新代码,但是它的缩进不对:

这时候,若直接“ctrl+alt+l”全局格式化,或者选中那三行再格式化,结果都不对!原因是第二个 if 的缩进格数小于 4 个,所以 PyCharm 认为它属于一级缩进(即不该有空格),所以自动格式化时就把它左移了。

如果选中它们,先按 tab 键右移(即新代码变成缩进大于 4 格,小于 8 格):

此时再作格式化的话,它们的缩进就跟第一层的 if 一致了(两层 if 是兄弟关系)。

同理,如果你想把新代码缩进到第一层 if 的内部(变为父子关系),那只需选中上图三行代码再 tab 键右移 4 格,之后格式化就可以了!

建议大家在编辑器里实操一下。等空了我会录制一期小视频(B 站搜“Python猫”),敬请留意。

除了上面的评论/观点之外,我们在微信交流群里也讨论了这个话题。@樱雨楼(https://github.com/yingyulou) 小姐姐的观点对我挺有启发。

群聊截图已记录在“Python知识星球”里(https://t.zsxq.com/jeM33bQ),其中她提到了编程语言在设计上的“比较抽象和哲学”的两点:

  • 缩进使得代码失去了形式语言里所谓的“上下文无关文法”,从而使得空格+数量的组合变得不再是可有可无的。
  • block 作为一个“语法组分”,需要一个定界符,而空格一般不作为语法组分,所以就觉得少了些什么。

三言两语没法转述清楚,但她谈论缩进话题的视角确实令人耳目一新!

上次的文章发出后,有不少小伙伴表示很喜欢 Python 的缩进。我本以为会听到很多这类的声音,没想到却是负面的评论更多。(也许更多认同的声音没有表现出来)

本文对几类典型的评论作出了回应,再次表达了我在这个话题上的关注和理解(以及情绪的抒发),希望也能给读者们带来一些思考和收获吧。

Python 的缩进是不是反人类的设计?的更多相关文章

  1. 吐槽 Apple iPhone 十大反人类的设计 All In One

    吐槽 Apple iPhone 十大反人类的设计 All In One 不支持 GPS 快捷开关 每次都要到,设置> 隐身 > 位置,脑残的设计 顶部的状态栏,网络不支持显示网速 顶部的状 ...

  2. Apple 产品反人类的设计 All In One

    Apple 产品反人类的设计 All In One 用户体验 shit rank WTF rank iPhone 更换铃声 WTF, 这么简单的一个功能搞得太复杂了 使用要下载 1.6 G的库乐队 A ...

  3. Apple 反人类的设计的产品组合

    Apple 反人类的设计的产品组合 Apple shit design macbook pro 2018 + beats solo3 MBP 的耳机孔在电脑右边, betas 的耳机孔在左边, 组合起 ...

  4. Vue中循环的反人类设计

    今天学习Vue到循环那里,表示真是不能理解Vue的反人类设计 具体看代码吧! <!DOCTYPE html> <html> <head> <meta char ...

  5. python代码缩进

    习惯了java,c++之类的宽容,初学python,被它摆了道下马威,写if else,竟然必须要我正确用缩进格式,原来在python里不能用括号来表示语句块,也不能用开始/结束标志符来表示,而是靠缩 ...

  6. Python代码缩进与测试模块

    一.Python代码缩进 Python 函数没有明显的  begin 和  end ,没有标明函数的开始和结束的花括号.唯一的分隔符是一个冒号 ( : ),接着代码本身是缩进的. 例如:缩进  bui ...

  7. 【Python⑥】python的缩进,条件判断和循环

    缩进 Python的最大特色是用缩进来标明成块的代码. 这点和其他语言区别很明显,比如大家熟悉的C语言里: ) { num+=; flag-=; } 而在python中: if flag>= 0 ...

  8. 反人类的MyEclipse之-Javascript双引号自动补全

    MyEclipse由于在JavaScript中按下一个双引号后会自动把后面的双引号补全.本人习惯两个双引号一起按下,那么这个时候在编辑器里就会出现三个",这样导致代码错误. 今天就因为MyE ...

  9. [python 译] 基于面向对象的分析和设计

    [python 译] 基于面向对象的分析和设计 // */ // ]]>   [python 译] 基于面向对象的分析和设计 Table of Contents 1 原文地址 2 引言 2.1 ...

随机推荐

  1. 使用 selenium 实现谷歌以图搜图爬虫

    使用selenium实现谷歌以图搜图 实现思路 原理非常简单,就是利用selenium去操作浏览器,获取到想要的链接,然后进行图片的下载,和一般的爬虫无异. 用到的技术:multiprocessing ...

  2. ubuntu-18.0.4 samba安装

    (1)安装 sudo apt-get -y install samba samba-common (2)创建一个用于分享的samba目录. mkdir /home/myshare (3)给创建的这个目 ...

  3. python-Django与Nginx整合gunicorn模块

    1.pip install gunicorn 2.修改Nginx配置文件 vim /etc/nginx/conf.d/virtual.conf server { listen ; #listen so ...

  4. Java IO 流-- 文件拷贝

    IO流操作套路: 1.创建源: 2.选择流: 3.操作: 4.释放资源 上代码: package com.xzlf.io; import java.io.File; import java.io.Fi ...

  5. Apk优化极致

    1. webp WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式.图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器宽带资源和数据空间.Facebook Ebay等知 ...

  6. /sbin/mount.vboxsf: mounting failed with the error: Protocol error

    公司换了新电脑,需要把之前的虚拟机的配置全部备份下来,在移动的过程中挂载共享文件夹时候出现了 /sbin/mount.vboxsf: mounting failed with the error: P ...

  7. 串口字符串-HEX格式

    串口字符串-HEX格式 C++SerialSerialPortHEX 介绍 串口通信过程中 通常涉及一个数据的模拟过程以及数据发送过程, 一般来说, 我们会发送一串指令给下位机 68 05 00 84 ...

  8. 基于规则的分类——RIPPER算法

    在<分类:基于规则的分类技术>中已经比较详细的介绍了基于规则的分类方法,RIPPER算法则是其中一种具体构造基于规则的分类器的方法.在RIPPER算法中,有几个点是算法的重要构成部分,需要 ...

  9. [mysql]linux mysql 读写分离

    [mysql]linux mysql 读写分离 作者:flymaster qq:908601287 blog:http://www.cnblogs.com/flymaster500/ 1.简介 当今M ...

  10. 外媒解读Web安全核心PKI的四大致命问题

    Web安全的立足根基在于复杂的PKI部署体系,但实际生活中得到正确部署的比例却非常有限,而且这一切都将随着摩尔定律的滚滚洪流灰飞烟灭. 我个人算是PKI(即公共密钥基础设施)的忠实拥护者.我热爱数学与 ...