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

400
我正在尝试使用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

45
这是你的代码编辑器的问题,与 Python 本身无关。你应该更改你的问题,注明你正在使用的编辑器。 - Jeff Mercado
5
您如何更改这个取决于您的编辑器。我不确定这是否是本讨论主题,这可能是超级用户的问题。 - Lennart Regebro
1
将您的编辑器更改为显示行首可见空格。例如,我已经配置我的编辑器以显示透明制表符和可见空格,因为我使用制表符缩进代码。如果我在行首看到任何噪音,我就知道有一个或多个额外的空格。如果您坚持使用不正确的方法,可以配置您的编辑器隐藏空格并显示制表符。(是的,我知道PEP-8,但我不同意它。) - Mikko Rantalainen
1
这个主题与实际问题几乎没有任何关系。在SO上有更好措辞的问题,涵盖了TabError和编辑器配置。理想情况下,应该删除整个问题,但由于它太旧且太活跃,这可能不是一个选项。如何改善这种情况,以便在那些寻求实际标题解决方案的人之前呈现更有用的答案? - sampi
1
鉴于讨论,我同意这不是一个高质量的问题。来到这里的人会想要更全面地了解这个主题,因此我将其链接为重复问题,并指向社区驱动的、人工制作的规范文档,该文档被故意制作得足够广泛,以涵盖一般缩进问题。 - Karl Knechtel
显示剩余5条评论
29个回答

411

不要使用制表符。

  1. 将编辑器设置为使用4个空格进行缩进。
  2. 使用查找和替换功能将所有制表符替换为4个空格。
  3. 确保您的编辑器将制表符显示为8个空格。

注意:将制表符设置为8个空格是为了方便您立即注意到无意中插入的制表符,例如从使用制表符而不是空格的示例代码中复制和粘贴时。


47
这些教条背后有任何推理吗? - RocketR
7
@RocketR:这个答案是针对Python的。如果你只使用制表符,你会得到一个8个空格的缩进,除非你将制表符扩展为不止8个空格,否则在其他编辑器上看起来会很糟糕。如果你混合使用制表符和空格,可能会导致代码无法运行(参见问题),或者如果你使用的是不止8个空格扩展制表符,则会看起来有问题。 总之:在缩进中使用制表符是极其糟糕的。永远不要这样做(除了需要使用制表符的语言/文件格式)。完毕。 - Lennart Regebro
2
@RocketR Python有Pep8文档,列出了“良好的Python风格”,明确指出4个空格是缩进的接受形式。 - daniel gratzer
7
“Spaces are the preferred indentation method.”,这是相关PEP 8中“制表符还是空格”的部分的第一句话。 - Tadhg McDonald-Jensen
3
对于vim编辑器:set tabstop=8 softtabstop=0 expandtab shiftwidth=4 smarttab,然后执行 %s/\t/ /g - Morris
显示剩余3条评论

223

针对Visual Studio Code用户

Ctrl + Shift + P 或者菜单 视图命令面板

输入:

>将缩进转换为空格

按下 Enter


11
如果您喜欢使用制表符进行工作,您可以通过重复上述说明并输入以下内容来再次将代码转换为制表符:> 将缩进转换为制表符 - carloswm85

151

使用下面的 autopep8 命令为我解决了这个问题:

 autopep8 -i my_file.py

autopep8的文档在此链接。


3
无法工作。 - Bruce wayne - The Geek Killer

50

使用IDLE编辑器,你可以执行以下操作:

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

40

当使用Sublime Text编辑器时,我能够选择代码段并出现了缩进中制表符和空格的不一致使用错误,然后选择:

菜单 查看缩进将缩进转换为空格

这样就解决了我的问题。


26

可以使用Notepad++通过用四个空格替换制表符来解决此问题:

  1. 选择搜索查找...或按Ctrl+F
  2. 选择替换选项卡
  3. 在名为搜索模式的框中选择扩展(\n,\r,\t,\0,\x...)
  4. 查找内容字段中输入\t
  5. 替换为字段中按空格键4次。确保此字段中没有其他内容。
  6. 单击全部替换按钮

How to replace Tabs with Spaces


1
请注意,这仅适用于所有制表符位于行的开头的情况(因此仅用于缩进,而不是对齐)。如果您在其他位置使用了制表符,则将其替换为4个空格可能会错误地更改您的缩进。 - wovano

18

一般来说,人们更喜欢使用空格进行缩进。这样在不同的编辑器中更加一致,减少了出现格式不匹配的情况。但是你可以选择使用制表符进行缩进。不过,你需要知道每个制表符标准为8个空格有点宽。

关于你的问题,很可能是你的编辑器出了问题。将制表符转换为空格取决于你所使用的编辑器。

例如,在Emacs中,你可以调用“untabify”方法。

在命令行中,你可以使用sed语句(根据你的需求适当调整空格数):

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

2
如果你想在Vim中对一个打开的文件进行此操作,可以输入以下命令::%s/\t/ /g这将把每个制表符替换为4个空格。 - jsaigle

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

3
Sublime Text 的替代方案 - 前往 "视图" -> "缩进" -> "将缩进转换为空格" - flying_fluid_four
如果你和我一样没有安装Anaconda,上面的评论是Sublime Text用户最快的解决方法。 - DaReal

10

Sublime Text 3

在编辑 Python 文件时,打开 Sublime Text 后:

菜单 文件首选项语法特定设置:

文件 Python.sublime-settings

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

8

我最近也遇到了同样的问题,后来发现只需要将.py文件的字符集转换为UTF-8即可,因为Python 3使用的就是这个字符集。

顺便说一下,我一直使用4个空格的制表符,所以问题不是由它们引起的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接