当我进行Python编程时,我总是使用制表符进行缩进.但后来我在SO上遇到了一个问题,有人指出大多数Python程序员使用空格而不是制表符来最小化编辑器到编辑器的错误.
这有什么不同?还有其他原因可以使用空格而不是Python的制表符吗?或者这不是真的吗?
我应该切换我的编辑器来插入空格而不是立即插入标签或继续像以前那样继续前进吗?
厌倦了追踪缩进拼写错误(8个空格?没有,7个哎呀9 ...)我将我的资源转换为"仅限标签".
1个标签== 1个缩进级别,句号
关键是:如果要将缩进显示为4,8或pi/12字符宽度,只需更改文本编辑器中的设置,不要弄乱代码.
(就个人而言,我使用4个字符宽度标签...但有些人更喜欢3或8个空格,甚至使用可变宽度字体.)
因为PEP-8告诉我们使用空格.
耶和华如此说:你要用四个空格缩进.不多也不少.四是你要缩进的空格数,你的缩进数应为四.八,你不要缩进,也不要缩进你的两个,除非你接着四个.标签是正确的. - Georg Brandl
使用显示标签字符的编辑器(所有空白,就此而言).你是编程,而不是写文章.
我用标签.选项卡中没有单空间错误的空间(如果可以看到它们).问题是人们使用不同的编辑器,世界上唯一常见的事情是:tab == indent,如上所述.有些人将tab键设置为错误的空格数,或者手动操作并弄得一团糟.TAB并使用真正的编辑器.(这不仅与PEP相反,它也与C/C++和其他与空白无关的语言有关).
/从肥皂盒下来
我在空格上使用制表符的主要原因是退格键.如果我在一条线上并且我想退格 - 只删除那一行上的缩进,我必须按空格键4x(如果它是空格); 然而,如果它是一个标签,我只需要打一次.
我将继续使用制表符,因为之前已经说过 - 它更容易从制表符转换为空格,但不是相反.
我想我想写一个简单的程序,用空格将代码转换为带有标签的代码,因为我讨厌仇恨空间.他们把我推到墙上!
哦! 使用箭头键向左和向右导航总是一个痛苦的屁股,当它是空格.
更新:Sublime Text 3现在删除带有退格键的完整软选项卡; 但是,箭头键导航仍然很乏味.
更新:我现在使用vscode并为它编写了一个TabSanity扩展来解决退格,删除和箭头键导航.
最"pythonic"的方法是每个缩进级别使用4个空格.然而,Python解释器将识别空格或制表符.唯一的问题是你必须永远不要混合空格和标签,选择其中一个.也就是说,规范建议使用空格,大多数开发人员都使用空格,所以除非你有充分的理由不这样做,否则我会说空格.
据我所知,这里有标签与空格的优缺点.
标签的优点:
缩进,取消和遍历缩进所需的键击次数减少.(即使你的IDE有一些空间缩进的聪明,它也永远不会像制表符一样好.)
不同的程序员可以根据需要使用不同的选项卡显示大小.
你永远不能让光标"在里面"成为缩进字符.例如,假设您正在复制某些行,使用标签可以在行的开头附近隐约点击以开始您的选择,您将获得所有第一个标签.使用空格你可能会错过第一个空格角色,除非你击中它和边距之间的微小目标.类似于从行中删除缩进,如果光标位于四个空格缩进字符的中间,大多数编辑器都不能很好地处理按退格键.它通常会删除一个空格.使用标签,它按预期工作.
与其他语言保持一致,因此您无需设置编辑器,例如C++/Java选项卡和Python空格.
错误的缩进可能更明显(即额外的标签比额外的空间大得多).
标签的缺点:
大多数Python程序员都使用空格,因此你会违反惯例.
使用空格来对齐多行语句比使用制表符更容易.您可以使用制表符缩进,空格对齐,但在Python中似乎有点冒险!
有些人夸大了一些非问题:
您可能会在带标签的缩进中获得杂散空间,这会使事情搞砸:几乎所有的IDE /编辑器都支持可视化空白,而且几乎可能会在空格缩进中获得杂散标签!无论如何,我无法看到这是一个常见的错误.此外,大多数缩进错误都将被Python捕获,好的IDE应该能够突出显示不同的缩进.
你不能轻易地用标签对齐:如果你想进行字符完美对齐,这是正确的,但PEP-8建议不要这样做,而且无论如何Python都不能很好地适应多行语句.
人们有在他们的编辑选项卡中显示的大小区别设置,使您的代码将在不同的地方看起来不同:是的,这实际上是标签的一个有益的特征.
我已经开始使用空格来与其他Python代码保持一致,但说实话,它很令人沮丧,我可能会改回标签.很大程度上取决于IDE的功能,但根据我的经验,对空间缩进的IDE支持不如使用选项卡那么好.
因此,除非您真的不喜欢与大多数(可能不是全部!)Python代码不一致,否则请使用制表符并打开空白可视化和缩进突出显示(如果可用).对我来说最大的原因是易于选择和(相当重要的IMO)击键减少.有些公约是愚蠢的.
更新:我发现全世界有一个编辑器(不包括像Vim这样的废话)正确支持空格作为缩进:Atom.它有一个名为"atomic tabstops"的选项,它使4个空格的行为就好像它在所有方面都是一个标签(除了能够调整它的大小).可悲的是,Atom是一个非常缓慢而臃肿的编辑器,但这是一个很棒的功能,如果你被迫使用空格,这可能是一个不错的选择.希望有一天其他编辑会开始支持它.这是VSCode的问题.
我最近发现了一篇题为" Python:关于缩进的神话 "的文章,讨论了这个问题和相关问题.这篇文章有充分的理由在编写Python代码时建议使用空格,但肯定存在分歧的余地.
我相信大多数Python程序员都只使用空格.
使用编辑器,当您按TAB键时,可以向空格键入插入空格,而不是插入\ t字符.然后忘记它.
我非常强烈地认为,无论历史惯例如何,制表符都是更好的选择,并且应该在未来编写的每个Python代码行中替换空格.就像踢出一个无能的暴君一样.我的理由是:作为核心价值的简单.使用两个或四个字符作为一个语义任务?除了传统,IMO没有任何理由.
你可以混合标签和空格......但是一个标签被认为是与8个空格相同的缩进,所以除非你的编辑器被设置为将标签视为8个空格,否则混合它们时会遇到麻烦.
使用空格而不是制表符时遇到的唯一不便是您无法轻松删除缩进级别; 你必须删除四个空格而不是一个标签.
标签规则.嵌套循环的相同参数,您希望将外循环"返回"1级.提示:如果要将旧的space-riddled python代码转换为选项卡,请使用TabOut实用程序作为http://www.textpad.com/add-ons/上的可执行文件.
当您在文件中混合缩进时,会发生编辑器到编辑器错误.这产生如下:一个代码块用4个空格缩进,然后一个缩进级别"in",它用缩进键缩进.现在做这个的异教徒(混合标签和空格)有它所以他的标签也是4个空格,所以他看不出任何问题,Python看不出任何问题.
现在我们的受害者来了,他的标签设置为8个空格.现在,我们的受害者认为代码看起来全部被破坏,并通过删除一级缩进来修复它,现在使代码看起来仍然是2级缩进,但实际上是一个级别.在这一点上,所有的地狱都破裂了.
这里的教训是,你永远不应该混合标签和空格.如果您坚持这一点,那么无论您个人使用哪种代码,都可以轻松地将代码重新插入空格或制表符.确保不混合制表符和空格的最佳方法是始终python
使用-tt
,这会在制表符和空格混合时产生错误.
对于制表符和空格,我个人使用制表符,使其与外观分开缩进 - 当使用制表符缩进代码时,更改代码的外观要比使用空格更容易.我知道这与99%的Python程序员所做的相反,但这是我个人的偏好,并且在任何情况下很容易将选项卡式文件转换为间隔文件.反过来并不总是正确的,因为你可能会意外地敲掉字符串中的4个空格等.
当我第一次学习Python的时候,由于大多数使用它的语言都不灵活,我因为大量的空白空间而被推迟了.也就是说,我对Python理解各种缩进样式的能力印象深刻.在考虑用于新项目的样式时,我认为记住两件事是很重要的.
首先,了解Python如何解释缩进很重要.Bryan Oakley在使用制表符时提到了逐个错误的可能性,但实际上这对于默认的解释器设置是不可能的.来自O'Reilly Media的学习Python有一个更好的解释.
基本上,有一个变量(可以通过在源文件#tab-width:的顶部添加注释来更改)来定义选项卡宽度.当Python遇到选项卡时,它会将缩进距离增加到下一个选项卡宽度的倍数.因此,如果在文件的左侧输入一个后跟选项卡的空格,则tab宽度的下一个倍数为8.如果输入选项卡本身,则会发生相同的事情.
通过这种方式,如果您的编辑器配置正确,使用选项卡,甚至混合选项卡和空格是安全的.只要将编辑器的制表符设置为与Python制表符宽度声明相同的宽度(如果不存在则为8).除非您在文件中指定制表符宽度,否则使用制表符宽度不超过8个空格的编辑器通常是个坏主意.
其次,Python的大部分语法设计都是为了鼓励同一个项目中程序员之间的代码可读性和一致的风格.也就是说,对于任何特定的项目来说,问题变成了使代码最能被项目人员阅读的代码.当然,保持一致的缩进样式是个好主意,但根据平台和项目使用的编辑器,不同的样式可能对不同的项目有意义.如果没有令人信服的理由不符合PEP 8,那么这样做是有意义的,因为它符合人们的期望.
我遇到过成功使用标签和空格混合的项目.基本上空间用于缩进小部分,其中它在缩进部分的事实相对不重要; 标签用于吸引读者注意大型结构特征.例如,类以tab开头,函数内部的简单条件检查使用两个空格.
在处理缩进多个级别的大块文本时,选项卡也很有用.当您退出3-4级压痕时,使用正确的选项卡排队要比排列适当数量的空格容易得多.如果项目不使用PEP 8建议的样式,最好将样式指南写入某个文件,以便缩进模式保持一致,其他人可以明确地阅读如何配置其编辑器以匹配.
此外,Python 2.x可以选择-t
发出有关混合选项卡和空格的警告并-tt
发出错误.这仅适用于同一范围内的混合制表符和空格.Python 3假设-tt
并且据我所知,没有办法禁用该检查.
每个人对缩进代码的数量都有不同的偏好.假设您与某人共享代码,并且他或她对缩进有不同的偏好.如果缩进位于选项卡中,则您的朋友可以随时更改其编辑器设置中的选项卡宽度.但是,如果缩进位于空格中,如果您想要将源代码设置为其首选项,则您的朋友实际上必须更改源代码.然后,当您收到朋友的更改时,您可能会决定将其更改回您的偏好.在这种情况下,您要么必须处理来回更改缩进级别的乏味,要么一个人必须在缩进级别采用其他人的首选项.如果你和你的朋友都使用标签,那么你有不同的偏好这一事实是没有问题的,因为你可以在代码保持不变的情况下看到不同的缩进级别.这就是为什么在我看来,制表符比所有编程语言中缩进的空格更好.
我主要是一名C++程序员,但有时我的项目包括少量的Python.我使用制表符缩进我的C++代码.这意味着我有三个选项:
在C++中使用制表符,在Python中使用空格.这允许我的C++文件保持原样,我遵循PEP-8建议,但我在我的项目中不一致.
更改我的C++代码以使用空格.这允许我项目中的所有文件保持一致,并且我遵循PEP-8建议,但要求我返回并更改我的所有C++文件.我认为这是件坏事,因为我更喜欢标签.
在我的C++代码和Python代码中使用选项卡.这使我的整个项目保持一致,并允许我使用我喜欢的缩进样式:tabs.缺点是我没有遵循PEP-8标准.
对于我的项目,我通常选择3.
经验和PEP-8都清楚地得出结论,TAB
应避免混合空间和s.如果你想混合它们,你必须在IDE中可视化空白 - 但是你放弃了Python缩进的优势,使范围很容易看到.可视化IDE中的空白会使显示混乱.
如果它是TAB 或空格,那么它必须是空格,原因很简单:人们可以切换几乎所有的IDE和文本编辑器来自动用空格替换制表符,但事实恰恰相反.
即使有IDE可以自动将行中的前导空格转换为制表符,但这最终会导致制表符和空格的混合.考虑多行语句,例如带有大量参数或doc字符串的函数调用.虽然"ascii-art"也应该被避免,但是在前导标签之后留下一个空间可能很容易发生.
其他答案带来了几个有利于标签的论据:
击球TAB
更有效率.当然这是事实,但是当按下Tab键时,所有文本编辑器都允许立即插入所需数量的空格
只需删除一个选项卡而不是2/3/4/8个空格,缩进/ Dedenting就更容易了.没错,但是大多数文本编辑器都允许自动执行此操作:块选择,缩进/ dedent是编程编辑器的基本功能,如注释/取消注释.如果文本编辑器没有实现它,它至少应该有一个易于使用的宏功能,可以实现相同的功能.
不同的程序员喜欢不同的缩进宽度.这是事实,TAB
只有使用s 的明显优势.问题是与其他个人和/或团队的互动.为了在现实世界中工作,每个人都必须同意所有使用TAB
s.由于这没有发生,它无论如何都不起作用.在现实世界的场景中,有一组项目同意的编码指南,并且缩进的方法肯定是其中之一 - 即使在其他编程语言中,其含义仅在视觉层面上"仅".
Imho,这里缺少大多数(如果不是全部)答案的要点是团队或个人之间的互动,特别是在一开始就不知道参与者名单的情况下.当代码满足代码时,所有代码都必须使用制表符或者所有必须使用空格.如果没有最终遇到功能问题,它就无法混合.人不完美.工具并不完美.这就是我们不应该使用TAB
s 的原因.
没有Greg在他的回答中提供的链接,没有答案是完整的:Python:关于缩进的神话
有一种情况,标签根本不起作用,即:根据您使用的编码样式,您可能需要将某些代码行缩进到一个空格的精度,即:
def foobar(): x = some_call(arg1, arg2)
在这种情况下,使用纯粹的标签根本不起作用; 使用主缩进的制表符和子缩进的空格将起作用,但会违反不混合两者的硬性规则.
但是,当使用避免上述代码示例中的情况的编码样式/约定文档时,情况并非如此.