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

前些天,我写了《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) 小姐姐的观点对我挺有启发。

缩进使得代码失去了形式语言里所谓的“上下文无关文法”,从而使得空格+数量的组合变得不再是可有可无的。

block 作为一个“语法组分”,需要一个定界符,而空格一般不作为语法组分,所以就觉得少了些什么。

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab作业1参考答案,matlab课后习题答案1到6章

rank(A); 范数:norm(A,1); 或 norm(A);或norm(A,inf);sumsumA(i);ax2 bx c, 0.5end x 1.5 BA(find(Ay asincb x, 1.5 x 3.5CB(find(rem(B,2)0));cdisp(C); lnb , 3.5 x 5.5条件数: cond(A,1); 或 cond(A,2); 或cond(A,inf)迹: trace(A);(2)【…

WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题

WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题目录一、触屏事件连带触发鼠标事件的问题二、DataGrid 误触问题及解决方法独立观察员 2021 年 10 月 10 日一、触屏事件连带触发鼠标事件的问题这个是 WPF 已知的问题,网络上也有一些讨论,但是没有…

Facebook应用Moments使用C++实现跨平台代码共享

据Facebook工程师Ashwin Bharambe、Zack Gomez及Will Ruben报道,作为Facebook最新应用之一的Moments正使用C实现跨iOS和Android平台共享业务逻辑。这里,我们将回顾一下Facebook工程师给出的选择C的理由和结果。\\对于Moments应用,为了“只关注…

ImportError: libpq.so.5: cannot open shared object file: No such file or directory

import psycopg2Traceback (most recent call last): File "<stdin>", line 1, in ? File "/usr/lib/python2.4/site-packages/psycopg2-2.4.1-py2.4-linux-x86_64.egg/psycopg2/__init__.py", line 71, in ? from psycopg2._psycopg import …

VS2008、VS2010中如何屏蔽讨厌的MSVCR*.dll的引用

VS系列工具作为目前微软主打的集成开发环境&#xff0c;在历经了近20多年的发展后&#xff0c;到如今已经可以说是Windows平台上各种IDE环境中的翘楚了。很多别的开发工具已经难望其项背了&#xff0c;如今VS2010也已经面市很长时间了&#xff0c;但是因为笔者囊中羞涩&#xf…

听说,99%的数学家都算不出这道题

全世界只有3.14 % 的人关注了爆炸吧知识著名的数学家毕达哥拉斯曾说&#xff1a;“朋友是你灵魂的倩影&#xff0c;要像220与284一样亲密。”就因为不经意的一句话&#xff0c;引发了一场数群和数学家长达几千年的“斗争”&#xff0c;甚至到现在依然没有结束&#xff01;无数个…

oracle账号区分大小写吗,实战Oracle 11g用户密码不区分大小写

连接到:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> show  parameter sec_case_sensitive_logonNAME TYPE VAL…

sql 多表多行模糊查询_从零开始学习SQL(五)多表查询

经过之前的学习&#xff0c;现在我们已经对查询有了一定的了解&#xff0c;但是我们目前的所有查询都只能找到在一张表中的数据&#xff0c;但如果我们需要寻找分布在多张表格中的数据时&#xff0c;这种之前的查询就做不到了&#xff0c;这时就需要引入一种新的查询方法&#…

最新.NET MAUI有什么惊喜?

点击蓝字关注我们.NET 6 RC1 现已发布啦&#xff0c;我们为 .NET 多平台应用程序 UI (MAUI) 引入了所有的新布局。这是性能和可靠性的重大变化。我们很高兴我们还增加了一些关于accessibility方面的基于新的SemanticService、字体缩放选项和对Xamarin.Forms 效果的兼容性的功能…

onWindowFocusChanged

这个onWindowFocusChanged指的是这个Activity得到或者失去焦点的时候 就会call。 也就是说 如果你想要做一个Activity一加载完毕&#xff0c;就触发什么的话 完全可以用这个&#xff01;&#xff01;&#xff01; package com.app.android05; import android.app.Activity; imp…

亲一下就搞定的事,绝不花钱解决!

1 好了&#xff0c;你表演吧&#xff0c;球不看了2 “你这个车&#xff0c;至少得100条小鱼干啊” 3 羡慕了4 还…还有这种操作&#xff1f;5 被秀了一脸哈哈哈6 没有什么是一个么么哒解决不了的&#xff01;你点的每个赞&#xff0c;我都认真当成了喜欢

SetComputerName改网络中计算机名

通过 Wiz 发布转载于:https://www.cnblogs.com/xe2011/archive/2012/06/02/2531620.html

VS2010自定义新建文件模版

不知不觉VS2010已经成为.NET开发人员的必备工具&#xff0c;相比经典版VS2005&#xff0c;到过渡版VS2008&#xff0c;2010在性能稳定性和易用性上都得到很大的提高。 结合VS工具&#xff0c;其下的插件也层出不穷。今天重点给大家介绍如何使用VS2010VS2010自定义新建文件模版&…

微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版

微软今天发布了Visual Studio 2022 最接近正式发布的RC版本&#xff0c;同时宣布在11月8日发布正式版&#xff0c;届时将在线上发布虚拟的发布活动&#xff0c;具体参见&#xff1a;https://devblogs.microsoft.com/visualstudio/join-us-november-8th-for-the-launch-of-visua…

python装备_Python重型武器:Django

Django&#xff0c;发音为[dʒŋɡəʊ](詹戈) &#xff0c;是用python语言写的开源web开发框架&#xff0c;并遵循MVC设计。MVC框架的核心思想是&#xff1a;解耦&#xff0c;让不同的代码块之间降低耦合&#xff0c;增强代码的可扩展性和可移植性&#xff0c;实现向后兼容。M…

安卓 广告位

需求&#xff1a;类似网易新闻客户端&#xff0c;listview头部要显示广告位&#xff0c;广告位数量动态从后台获取&#xff0c;并且不一定一直有广告位 问题&#xff1a;listview下拉刷新与广告位touch事件的冲突解决&#xff0c;广告位的左滑右滑事件与整个fragment的左右切换…

arcgis oracle trace,ArcGIS应用Oracle Spatial特征分析

该文章并不是将Oracle Spatial与ST_Geometry做对比&#xff0c;关于两者的对比&#xff0c;可以参考&#xff1a;http://www.linuxidc.com/Linux/2011-10/45492.htm&#xff0c;这里从数据结构&#xff0c;到性能对比&#xff0c;都描述的很清楚。其实这篇文件就是说明一下在A…

SharePoint Timer Job

首先介绍一下什么是定时器作业&#xff0c;说的再多&#xff0c;也不如一张图说的清楚这两张图应该把我想说的已经表达清楚了&#xff0c;下一步介绍一下如何自定义Timer Job第一步&#xff1a;创建一个类&#xff08;CustomTimerJob.cs&#xff09;第二步&#xff1a;引用 usi…

python获取div标签的id_Python 获取div标签中的文字实例

预备知识点compile 函数compile 函数用于编译正则表达式&#xff0c;生成一个正则表达式( Pattern )对象&#xff0c;供 match() 和 search() 这两个函数使用。语法格式为&#xff1a;re.compile(pattern[, flags]).compile(pattern[, flags])参数&#xff1a;pattern : 一个字…

生活是长跑

人生不是百米冲刺&#xff0c;是长跑&#xff0c;需要日积月累&#xff0c;建立自己的人生观&#xff0c;生活态度&#xff0c;从各个方面去不断的积累自己&#xff0c;最后才能获取成功的人生。 生活是一个系统工程&#xff0c;每一方面都要经营维护&#xff0c;不要因为某种…