“缩进中的制表符和空格使用不一致”


218

我试图在Python 3.2中创建一个应用程序,并且一直使用制表符进行缩进,但是即使编辑器也将其中的一些更改为空格,然后在尝试运行时打印出“不一致使用制表符和空格”该程序。

如何将空格更改为制表符?这让我疯狂。(我是编程的初学者)。如果我能在代码中获得一些总体提示,我会很高兴,如果我犯了很多错误,我会很高兴听到。

import random

attraktioner = ["frittfall","bergodalbana","spökhuset"]


class Nojesfalt:
    def __init__(self, attraktion):
        self.val = attraktion
        self.langd = 0
        self.alder = 0


#längdgräns för fritt fall
    def langdgrans(self):
        print("")
        self.langd = int(input("Hur lång är du i cm? "))
        if self.langd < 140:
            print("tyvärr, du är för kort, prova något annat")
            return 0
        elif self.langd >= 140:
            print("håll dig hatten, nu åker vi!")
            print(" ")
            return 1

#åldersgräns för spökhuset
    def aldersgrans(self):
        print("")
        self.alder = int(input("Hur gammal är du? "))
        if self.alder < 10:
            print("tyvärr, du är för ung, prova något annat")
            return 0
        elif self.alder >= 10:
            print("Gå in om du törs!")
            print(" ")
            return 1


#åker attraktion frittfall lr bergodalbana
        def aka(self):
                print("")
        print(self.val)
        tal = random.randint(0,100)
        if tal < 20:
            print("åkturen gick åt skogen, bättre lycka nästa gång")
        elif tal >= 20:
            print("jabbadabbbadoooooooo")
            return 1

#går i spökhuset
        def aka1(self):
                print("")
        print(self.val)
        tal = random.randint(0,100)
        if tal < 20:
            print("du är omringad av spöken och kan inte fortsätta")            return 0
        elif tal >= 20:
            print("Buhuuuuuu, buuuhuuuu")
            return 1

#programkod
print("Välkommen till nöjesfältet, vad vill du göra?")
print(" ")

while 1:
    vald_attr = input("Vad vill du göra?\n1. frittfall\n2. bergodalbana\n3. spökhuset\n4. Avsluta\n")
    if vald_attr == "1":
        val = Nojesfalt(attraktioner[0])
        if val.langdgrans() == 1:
            val.aka()
    elif vald_attr == "2":
        val = Nojesfalt(attraktioner[1])
        val.aka()
    elif vald_attr == "3":
        val = Nojesfalt(attraktioner[2])
        if val.aldersgrans() == 1:
            val.aka1()
    elif vald_attr == "4":
        break

25
这是您的代码编辑器的问题,而不是python的问题。您应该更改您的问题以反映这一点,并提及您正在使用的编辑器。
Jeff Mercado

3
如何更改它取决于您的编辑器。我不确定这在这里是否很热门,这可能是超级用户的问题。
Lennart Regebro

更改您的编辑器以在行的开头显示可见的空白。例如,我已将编辑器配置为显示透明标签和可见空间,因为我使用标签来缩进代码。如果我在行的开头看到任何噪音,则知道有一个或多个多余的空格。如果您坚持以错误的方式进行操作,则可以将编辑器配置为隐藏空格并显示选项卡。(是的,我了解PEP-8,但我不同意。)
Mikko Rantalainen

Answers:


273

不要使用标签。

  1. 将您的编辑器设置为使用4个空格进行缩进。
  2. 搜索并替换以4个空格替换所有选项卡。
  3. 确保您的编辑器设置为标签显示为8个空格。

注意:制表符使用8个空格的原因是,您可以立即注意到无意间插入了制表符的情况-例如,在使用制表符而不是空格的示例代码中进行复制和粘贴时。


7
这些教条背后有什么道理吗?
RocketR 2011年

1
@Lennart Regebro,我的意思是完全使用空格。我确实使用过它们,但在不知不觉中,制表符对我来说似乎更好。顺便说一句,在Ruby编程中,每个人都使用2个空格,因此这并不是所有规则。
RocketR 2011年

3
@RocketR:答案是针对Python。如果仅使用制表符,则会得到8个空格的缩进,除非将制表符扩展到8个空格以外的其他位置,否则在其他编辑器上看起来会很糟糕。如果您混合使用制表符和空格,则可能会折断(请参阅问题),或者如果您使用的不是8位数的制表符扩展名,则可能看起来破损。总结:使用制表符进行缩进是非常糟糕的。永远不要这样做(需要的语言/文件格式除外)。结束。
Lennart Regebro

2
@RocketR Python具有Pep8,该文件列出了“良好的python样式”,该文件明确指出缩进可以接受4个空格。
Daniel Gratzer 2013年

4
链接到有关“标签与空间”扰流器的PEP 8相关部分:第一行是“空间是首选的缩进方法”。
塔德格·麦当劳-詹森


43

使用IDLE编辑器,您可以使用以下命令:

  • 菜单编辑全选
  • 菜单格式取消制表区域
  • 假设您的编辑器已用制表符替换了8个空格,请在输入框中输入8。
  • 点击选择,它会修复整个文档。

15

如果您将Sublime Text用于Python开发,则可以使用Anaconda软件包来避免该错误。安装Anaconda后,在Sublime Text中打开文件,右键单击空白处→选择Anaconda →单击自动格式化。完成。或按Ctrl+ Alt+ R


12

通常,人们喜欢缩进空间。各个编辑器之间的一致性更高,从而减少了此类不匹配的情况。但是,您可以缩进制表符。这是你的选择; 但是,您应该注意,每个制表符8个空格的标准有点宽。

关于您的问题,很可能是您的编辑搞砸了。将制表符转换为空格实际上取决于编辑器。

例如,在Emacs上,您可以将方法称为“ untabify”。

在命令行上,您可以使用sed行(将空格数调整为任何您喜欢的值):

   sed -e 's;\t;       ;' < yourFile.py > yourNedFile.py

9

当使用崇高的文本编辑器时,我能够选择inconsistent use of tabs and spaces in indentation出现错误的代码段,然后选择:

view > indentation > convert indentation to spaces

为我解决了这个问题。


8

当出现相同错误时我该怎么做:选择所有内容(Str+ A),然后按Shift+ Tab。因此,不再缩进。现在回到您要缩进的行,然后将其放回所需的位置。

它对我有用...


7

我最近遇到了同样的问题,发现我只需要将.py文件的字符集转换为UTF-8,这就是Python 3所使用的设置。

顺便说一句,我一直都使用4空格制表符,因此问题并不是由它们引起的。


6

崇高文字3

在崇高的文本,WHILE 编辑一个Python的文件:

Sublime Text菜单 >首选项 >设置-特定于语法

Python.sublime设置

{
    "tab_size": 4,
    "translate_tabs_to_spaces": true
}

5

notepad++通过将Tabs 替换为4 Spaces 可以解决此问题:

  1. 选择搜索->查找...或按Ctrl+F
  2. 选择替换标签
  3. 在名为“ 搜索模式”的框中,选择“ 扩展(\ n,\ r,\ t,\ 0,\ x ...)
  4. 在字段中查找内容:\ t
  5. 在“ 替换为 ”字段中Space4次。确保此字段中没有其他内容。
  6. 单击按钮全部替换

如何用空格替换制表符


3

我有这个问题。解决方案:问题行之前的“制表符”是空格,4、6或8个空格。您应该擦除它们并插入TAB。'\ t'。就这样。


不建议使用Python编码时完全使用TAB字符-阅读PEP008(python.org/dev/peps/pep-0008
Tony Suffolk

2

我使用Notepad ++并收到此错误。

在Notepad ++中,您将看到制表符和四个空格都相同,但是当您将代码复制到Python IDLE时您会看到区别,并且带有制表符的行比其他行之前有更多空间。

为了解决该问题,我只是删除了该行之前的选项卡,然后添加了四个空格。


2

我有同样的错误。我必须在现有的* .py文件中添加几行代码。在记事本++中,它不起作用。

添加代码行并保存后,我得到了相同的错误。当我在PyCharm中打开相同的文件并添加行时,错误消失了。


1

我遇到了相同的错误,但无法弄清楚自己在做什么错。

因此,我通过在代码上运行自动缩进并允许机器修复我的错误来修复它。

如果有人想知道我是怎么做到的。简单。进入vim。输入G = gg。

这将自动修复所有问题。祝好运 :)


1

您的问题是由于您的编辑器限制/配置。一些编辑器通过以下方式为您提供解决问题的工具:

  1. 将制表符转换为空格

    例如,如果您使用的是Stani的Python编辑器,则可以对其进行配置以在保存时执行此操作。

  2. 将空格转换为制表符

如果您使用的是ActiveState Komodo,则可以使用一个工具来“制表”代码。正如其他人已经指出的那样,这不是一个好主意。

Eclipse的Pydev提供了“将制表符转换为空格键”和“将制表符转换为空格键”功能。


1

如果您的编辑器在进行搜索和替换时(例如SciTE)无法识别选项卡,则可以将代码粘贴到Word中,然后使用Ctr-H和^ t搜索,然后找到可以替换为4个空格的选项卡。


1

有这个问题从重复这里,但我想我会提供一个视图做现代的编辑和他们所提供的功能繁多。使用python代码时,所有需要在.py文件中使用的东西都需要全部使用Tab键或空格来实现。惯例是使用四个空格进行缩进。大多数编辑器都可以在编辑器上直观地显示代码是使用空格还是制表符缩进,这对于调试非常有帮助。例如,使用atom,转到首选项,然后进入编辑器,您可以看到以下两个选项:

原子编辑器以显示标签和空格

然后,如果您的代码使用空格,则会在代码缩进的地方看到小点:

在此处输入图片说明

如果使用选项卡将其缩进,您将看到以下内容:

在此处输入图片说明

现在,如果您注意到了,您会发现在使用选项卡时,左侧还有更多错误/警告,这是因为有一个名为pep8 pep8 documentation的东西,该文档基本上是python的统一样式指南,因此所有开发人员都大多将代码编写为相同的标准和外观,在尝试理解其他人的代码时会有所帮助,在pep8中,它倾向于使用空格来缩进而不是使用制表符。我们可以看到编辑器显示有与pep8警告代码有关的警告W191

希望以上所有内容都能帮助您了解所遇到问题的性质以及将来如何解决该问题。


0

有时,tab缩进时会弄乱。一种方法是明显使用tabandbackspace正确缩进代码。

另一种方法是使用space 4次(取决于您要缩进多少)。

这是一种怪异的方式,当我没有其他任何东西起作用时,它对我有用,无论遇到错误的backspaced那一行,我都将该行移到上一行,然后按enter。它会自动将行缩进正确的位置,此后我没有收到任何错误。

希望这会有所帮助。


0

我有同样的问题,并使用以下python脚本进行修复。希望对别人有帮助。

这是因为使用制表符和空格来缩进代码。在此脚本中,我将每个选项卡替换为四个空格。

input_file = "source code path here"  # e.g. source.py
output_file = "out put file path here"  # e.g out.py
with open(input_file, 'r') as source:
    with open(output_file, 'a+') as result:
        for line in source:
            line = line.replace('\t', '    ')
            result.write(line)

如果您使用sublime或其他任何提供文本替换工具的编辑器,则可以用编辑器中的四个空格替换所有制表符。


0

对于python使用Idle,对于python3使用Idle3。


2
详细说明此操作的方式/原因对您很有帮助。
塔斯林·奥塞尼

问题是由于制表符而不是区域中的空格。空闲可以取消整个区域的列表,并解决该问题(只需从菜单格式中选择“取消列表”)。
simc

0

使用Vim编辑器解决这个问题

  1. 打开终端(Ctrl+ Alt+ T)。
  2. 转到文件所在的目录(cd <path_to_your_directory>)。例如:cd /home/vineeshvs/work
  3. 在Vim(vim <file_name>)中打开文件。例如:vim myfile.txt
  4. [可选步骤]在Vim中启用搜索关键字突出显示(ESC :set hlsearch
  5. 转到存在此问题的行(ESC :<line_number>)。例::53ESC一次按钮后,在Vim编辑器中。
  6. 在Vim(:.,$s/\t/<give_as_many_spaces_as_you_want_to_replace_tab>/gc)中使用所需的空格数替换标签。例如:使用以下命令将Tab替换为四个空格::.,$s/\t/ /gcESC 一次按钮后)。此过程是交互式的。您可以y使用空格替换选项卡,并n跳过特定的替换。按ESC当你与所需要的替代完成。

0

我的一个.py文件奇怪地遇到了类似的问题。我只是在Pycharm中打开了文件,然后按Option+ Command+ L一次正确地格式化了文件内容。

我怀疑自己遇到了麻烦,因为我是通过jupyter实验室对这个特定的.py文件进行编码的,而不是我通常选择的sublime文本或Pycharm,因此遇到了一些隐藏的缩进问题,这里提到了许多答案


0

好吧,我遇到了同样的问题,我意识到问题是我将代码从另一个python编辑器复制到了sublime。

我在使用jupyter笔记本工作,然后将代码复制到了高级代码中。显然,当您进行特定的修改(例如在函数中移动代码)时,缩进变得混乱,这就是问题所在。

因此,只需坚持一位编辑。如果这样做,那么您将没有问题。




0

尝试删除缩进,然后系统地按Tab键或空格键4次。当我使用Tab键缩进然后在下一行使用空格键时,通常会发生这种情况。


-2

突出显示缩进的位,然后单击制表符。然后它们将变得一致:)


2
这与规范的Python样式指南PEP 8冲突,PEP 8建议使用4个空格。建议人们使用标签更加不一致。
Aurora0001 '16

更不用说如果正在使用PEP8的此代码合作者遇到相同的错误
Thomas Matthew
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.