前些天,我写了《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. 以下关于python缩进_Python 的缩进是不是反人类的设计?

    Python 的缩进是不是反人类的设计? 前些天,我写了<Python为什么使用缩进来划分代码块?>,文中详细梳理了 Python 采用缩进语法的 8 大原因.我极其喜欢这种简洁优雅的风格 ...

  2. 手机这5个反人类的设计,你能容忍到第几个?

    | 本文经授权转载自微信公众号手机教授(ID:sj9983)作者:手机教授 手机更新换代越来越快,手机设计也年年推陈出新,纵观一直以来的手机设计,有不少是反人类.令人费解的,比如以下5个就是,看看你能 ...

  3. python中意外缩进是什么意思_Python 的缩进是不是反人类的设计?

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

  4. python的缩进机制是其缺点之一_Python 的缩进是不是反人类的设计?

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

  5. python中for循环缩进_Python基础- 缩进,选择和循环

    缩进: Python最具特色的是用缩进来标明成块的代码.下面我以if选择结构来说一下 if x >0: print "Test" print "Hello,worl ...

  6. python缩进设计_Python 的缩进是不是反人类的设计?

  7. python如何取消缩进_python如何处理缩进

    对于Python的这种"缩进"风格,喜欢它的人说这是一种乐趣:不喜欢它的人说这是一门需要卡尺的语言,因为需要使用"游标卡尺"去测量每行代码的缩进. 不管怎么样, ...

  8. python首行缩进_python中缩进

    初识Python 初识Python 跟学习所有的编程语言一样,首先得了解这门语言的编程风格和最基础的语法.下面就让我们一起来了解一下Python的编程风格. 1.逻辑行与物理行 在Python中有逻辑 ...

  9. python3.8缩进的格式要求_python首行缩进_python中缩进

    初识Python 初识Python 跟学习所有的编程语言一样,首先得了解这门语言的编程风格和最基础的语法.下面就让我们一起来了解一下Python的编程风格. 1.逻辑行与物理行 在Python中有逻辑 ...

最新文章

  1. AI一分钟|苹果无人车可根据乘客情绪调整行车方式;快商通完成近亿元融资
  2. SAP Batch Derivation功能初探之二
  3. 【学习】Java的反射机制
  4. oracle 报错pls 00405,oracle - 检查是否存在PLS-00405:在此上下文中不允许子查询 - 堆栈内存溢出...
  5. 根据图片URL获取图片的尺寸【Swift语言实现】
  6. python5数据存储
  7. kk 服务器信息,手机kk服务器设置
  8. 实战中的Agile开发
  9. 《集异璧》作者侯世达:王维、杨绛与机器翻译的本质
  10. EGE基础入门篇(五):换上我的彩色画笔
  11. wxPython色环电阻计算器
  12. 浏览器主页被篡改劫持怎么办
  13. PKI、X509、PKCS及证书相关等
  14. react setState 和 this.state区别 以及需要注意
  15. python表达直角坐标系_在直角坐标中,x、 y 是坐标系中任意点的位置,用 x 和 y 表示第一象限或第二象限的 Python 表达式为 。_测量省赛理论答案_学小易找答案...
  16. c51中断优先级c语言,基于proteus的51单片机开发实例(14)中断嵌套和中断优先级...
  17. 18春计算机辅助设计作业答案,18春福师《计算机辅助设计—MAYA》在线作业二答案...
  18. JAVA的反射机制==用反射分析类的实现
  19. 关于SSD HMB与CMB
  20. PB实现BASE64加解密

热门文章

  1. POJ 3667 hotel(shǎ崽大神的模板|区间合并)
  2. jquery实现的滚动新闻(多个实例代码)
  3. IEnumerable接口
  4. maven 打包数据库加密_SpringBoot项目application.yml文件数据库配置密码加密的方法...
  5. linux su root 免密码,Ubuntu 18.04.2切换到root用户的三种方式及设置免密码操作
  6. php单线程的缺点,PHP在设计上有哪些缺陷?
  7. android+坐标类,Android Path和PathMeasure类的使用之获取圆弧上的坐标值
  8. mysql架构 三级主从同步_MySQL 主从同步架构中你不知道的“坑”
  9. 天线越大越好吗_无线路由知识误区!解读天线数量与信号强弱的关系
  10. oracle解锁用户实例,在Oracle 11G R2里启用示例帐户scott