目前我在 Python 中从来没有遇到过空格问题(尽管我只在两个项目中使用过它,而且我是唯一的程序员)。对于学习该语言的人来说,Python 中的空格和缩进有哪些潜在的陷阱?
17 回答
在某些编辑器中可能会造成混淆,其中一行用空格缩进,下一行用制表符缩进。这令人困惑,因为缩进看起来相同但会导致错误。
此外,当您复制代码时,如果您的编辑器没有缩进整个块的功能,那么修复所有缩进可能会很烦人。
但是有了一个好的编辑器和一些练习,这应该不是问题。我个人非常喜欢 Python 使用空格的方式。
是的,有一些陷阱,但大多数时候,在实践中,它们变成了吉诃德式的敌人风车,即虚构的,在现实中没有什么可担心的。
我估计最有可能遇到的陷阱是(包括确定的缓解步骤):
与他人一起工作,也就是协作
一种。如果您有其他人出于某种原因拒绝遵守PEP 8,那么维护代码可能会变得很痛苦。一旦我向他们指出 python 的几乎通用约定是缩进级别 == 四个空格,我在实践中从未见过这种情况
湾。让与您一起工作的任何人/每个人都接受约定,并让他们弄清楚如何让他们的编辑器自动执行此操作(或者更好的是,如果您使用相同的编辑器,请向他们展示如何配置它),以便复制和粘贴东西就可以了。
如果您当前首选的编辑器不是 python 友好的,则必须投资一个“体面”的编辑器而不是您当前首选的编辑器——这不是一个真正的陷阱,更多的是投资要求,以避免提到与复制和粘贴相关的其他陷阱,重构等停止使用记事本,你会在早上感谢自己。
一种。在理解的编辑器下,您编辑代码的效率会高得多
python
湾。大多数现代代码编辑器都可以很好地处理 python。我自己更喜欢 GNU Emacs,最近的版本
python-mode
提供了开箱即用的出色支持。还有许多其他编辑器可供探索,包括许多免费的替代品和IDE。C。python 本身带有一个“智能”python 编辑器,开箱即用
idle
。如果您不熟悉,请查看它,因为它可能已经在您的 python 安装中可用,甚至可能python
比您当前的编辑器支持得更好。 PyCrust是在 python 中实现的 python 编辑器的另一个选项,它是 wxPython 的一部分。一些包含 python 的代码生成或模板环境(想想 HTML 生成或 python CGI/WSGI 应用程序)可能有怪癖
一种。他们中的大多数人,如果他们接触了 python,已经采取措施将 python 的性质作为一个问题最小化,但它仍然偶尔会弹出。
湾。如果您遇到这种情况,请熟悉框架作者已经采取的最小化影响的步骤,并阅读他们的建议(是的,如果在他们的项目中遇到过,他们会有一些建议),并且很容易在此避免与 python 相关的陷阱。
这实际上让我有一段时间远离 Python。来自强大的 C 背景,我感觉自己开车时没有系安全带。
当我试图在我的编辑器中使用样板文件、常用类填充代码段库时,情况变得更糟了。我通过例子学得最好,所以我尽可能多地抓住有趣的片段,目的是在学习的同时编写一个有用的程序。
在我养成了重新格式化我借来的所有东西的习惯之后,它并没有那么糟糕。但是还是觉得很别扭。我不得不习惯动态类型语言加上缩进来控制我的代码。
这对我来说是一个很大的飞跃:)
当我查看 C 和 Java 代码时,它总是很好地缩进。
总是。很好。缩进。
显然,C 和 Java 人员花费大量时间来正确处理他们的空白。
Python 程序员也是如此。
空白块分隔符强制进行一定数量的代码格式化,这似乎激怒了一些程序员。我们店里的一些人似乎认为他们太忙了,或者懒得去关注格式标准,而一种强迫它的语言使他们生不如死。有时,当其他人不遵循将花括号放在新行上的相同模式时,同样的人会抱怨;)
我发现来自网络的 Python 代码通常更“可读”,因为这种次要格式要求已经到位。IMO,这个要求是一个非常有用的功能。
IIRC,Haskell、OCaml (#light) 和 F# 不也以同样的方式使用空格吗?出于某种原因,我没有看到任何关于这些语言的投诉。
很久以前,在很远很远的环境中,有一些语言(如RPG)依赖于穿孔卡片的列结构。这是一个乏味且烦人的系统,并导致许多错误,而新的语言(如 BASIC、pascal 等)的设计没有这种依赖性。
一代程序员接受了这些语言的培训,并反复告诉他们可以自由地将任何东西放在任何地方是新语言的一个很棒的特性,他们应该感激不尽。多年来,这种自由被使用、滥用和校准(参见IOCC )。
现在钟摆已经开始回摆,但很多人还记得强制布局在某种程度上是不好的模糊,并抵制它。
恕我直言,要做的事情是按照自己的方式使用语言,而不是沉迷于品味-伟大-不那么充实的战斗。
有人说他们不喜欢 python 缩进,因为它会导致错误,如果制表符和空格混合在一起,将很难检测到。例如:
1 if needFrobnicating:
2 frobnicate()
3 update()
根据选项卡的宽度,第 3 行可能与第 2 行位于同一块中,或者在封闭块中。这不会导致运行时或编译错误,但程序会做意想不到的事情。
虽然我在 python 中编程了 10 年,但从未见过由混合制表符和空格引起的错误
当 python 程序员不遵循PEP 8中定义的“每个缩进级别使用 4 个空格”的通用约定时。(如果您是 python 程序员并且还没有阅读它,请阅读)
然后你遇到复制粘贴问题。
选择一个好的编辑器。您需要以下功能:
- 模拟最后缩进行的自动缩进
- 您可以控制的自动缩进(制表符与空格)
- 显示空白字符
- 加载文件时检测和模仿空白约定
例如,Vim 让我使用以下设置突出显示选项卡:
set list
set listchars=tab:\|_
highlight SpecialKey ctermbg=Red guibg=Red
highlight SpecialKey ctermfg=White guifg=White
可以随时使用以下方法关闭:
set nolist
IMO,我不喜欢将制表符转换为空格或反之亦然的编辑器设置,因为您最终会混合使用制表符和空格,这可能很讨厌。
我曾经认为空白问题只是习惯的问题。
有人指出了 Python 缩进的一些严重缺陷,我认为它们是非常有效的,对这些的一些潜意识理解是让经验丰富的程序对整个事情感到紧张的原因:-
- 剪切和粘贴不再起作用了!您不能从一个应用程序中剪切样板代码并将其放入另一个应用程序。
- 你的编辑变得无力帮助你。对于 C/Jave 等,“官方”大括号缩进和“非官方”空白缩进有两件事。大多数编辑器都能够重新格式化空白缩进以匹配大括号嵌套——如果缩进不是你所期望的,这会给你一个字符串视觉线索,表明出现了问题。使用 python 的“空间即语法”范式,您的编辑器无法为您提供帮助。
- 在已经很复杂的逻辑中引入另一个条件的痛苦。在现有条件中添加另一个 if then else 涉及在多行上手动插入大量容易出错的愚蠢空格。
- 重构是一场噩梦。在类周围移动代码块非常痛苦,忍受“错误”的类结构比将其重构为更好的结构更容易。
如果你使用 Eclipse 作为你的 IDE,你应该看看 PyDev;它自动处理缩进和间距。您可以从混合间距来源复制粘贴,它会为您转换它们。自从我开始学习这门语言以来,我从来没有考虑过间距。
这真的不是问题。无论如何,理智的程序员都会缩进。使用 Python,您只需做您一直在做的事情,而不必键入和匹配大括号。
陷阱
在忽略缩进的网站上发布代码片段可能会很烦人。
很难看出多行匿名函数(lambdas)如何适应语言的语法。
这使得将 Python 嵌入 HTML 文件以制作模板变得困难,就像 PHP 或 C# 可以嵌入 PHP 或 ASP.NET 页面一样。但这不一定是设计模板的最佳方式。
如果您的编辑器没有用于块缩进和缩进的合理命令,那么重新对齐代码将会很乏味。
好处
甚至迫使懒惰的程序员编写清晰的代码。我见过一些大括号语言代码的例子,我不得不花费数小时重新格式化才能阅读它......
Python 程序员不需要花费数小时来讨论大括号应该放在 K&R 风格的行尾还是 Microsoft 风格的自己的行上。
释放大括号字符以用于字典和集合表达式。
自动清晰易读
问题在于,在 Python 中,如果您在文件的一个区域中使用空格来缩进基本块,而在另一个区域中使用制表符来缩进,则会出现运行时错误。这与 C 中的分号完全不同。
不过,这并不是一个真正的编程问题,不是吗?
我曾经遇到的唯一麻烦是在我决定是否喜欢制表符或空格,或者从网站上剪切和发布代码之前使用我编写的代码时出现轻微的烦恼。
我认为现在大多数体面的编辑器都有一个将制表符转换为空格并返回选项。Textmate当然可以。
除此之外,压痕从来没有给我带来任何麻烦。
如果您使用 emacs,请将硬制表符长度设置为 8,将软制表符长度设置为 4。这样您将被更改为任何无关的制表符。您应该始终使用 4 个空格而不是制表符。
作为 python 的初学者,我遇到的一个缺点是忘记在我的编辑器中设置 softtabs,这给我带来了很多麻烦。
但是在认真使用该语言一年之后,我无法再用任何其他语言编写缩进不佳的代码。
不,我会说这是我找不到失败的一件事。是的,这无疑会让某些人感到恼火,但这只是因为他们对格式的风格有不同的习惯。早点学习,它会坚持下去。看看我们有多少关于 C、Cpp、Java 等语言的风格问题的讨论。您看不到关于 Python、F77 以及此处提到的其他一些具有“固定”格式样式的语言的那些(毫无疑问是无用的)讨论。
唯一可变的是空格与制表符(可以使用任何好的编辑器稍微麻烦地更改),以及选项卡占的空格量(可以使用任何好的编辑器轻松更改)。瞧!风格讨论完成。
现在我可以做一些有用的事情了:)