【问题标题】:"inconsistent use of tabs and spaces in indentation"“缩进中制表符和空格的使用不一致”
【发布时间】:2011-08-06 19:46:18
【问题描述】:

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

【问题讨论】:

  • 这是您的代码编辑器的问题,而不是 python 的问题。您应该更改您的问题以反映这一点并提及您正在使用的编辑器。
  • 如何更改取决于您的编辑器。我不确定这是否是主题,这可能是超级用户的问题。
  • 更改您的编辑器以在行首显示可见的空白。例如,我已将编辑器配置为显示透明制表符和可见空格,因为我使用制表符来缩进代码。如果我在行首看到任何噪音,我就知道有一个或多个额外的空格。如果您坚持以不正确的方式进行操作,您可以将编辑器配置为隐藏空格并显示选项卡。 (是的,我知道 PEP-8,但我不同意。)
  • 这些问题可以根据你选择的ide来解决
  • @Zina 在使用代码编辑器时有一定的义务,例如在 Coursera 上完成作业时不能使用任何其他编辑器。

标签: python


【解决方案1】:

一般来说,人们更喜欢用空格缩进。它在编辑器之间更加一致,从而减少了此类不匹配。但是,您可以使用制表符缩进。这是你的选择;但是,您应该知道每个制表符 8 个空格的标准有点宽。

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

例如,在 Emacs 上,您可以调用方法“untabify”。

在命令行上,您可以使用 sed 行(根据您的喜好调整空格数):

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

【讨论】:

  • 如果您想在 Vim 中打开一个文件,您可以输入以下内容::%s/\t/ /g 这会将每个制表符替换为 4 个空格。
【解决方案2】:

不要使用标签。

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

注意:制表符使用 8 个空格的原因是为了让您在无意中插入制表符时立即注意到 - 例如从使用制表符而不是空格的示例代码复制和粘贴时。

【讨论】:

  • 这些教条背后有什么原因吗?
  • @Lennart Regebro,我的意思是完全使用空格。我确实使用它们,但不知不觉地,标签对我来说似乎更好。顺便说一句,在 Ruby 编程中,每个人都使用 2 个空格,所以这不是一个适用于所有人的规则。
  • @RocketR:答案是 Python。如果你只使用制表符,你会得到一个 8 个空格的缩进,除非你将制表符扩展到 8 个空格以外的东西,在这种情况下,它在其他编辑器上看起来很糟糕。如果您混合使用制表符和空格,它可能会损坏(请参阅问题),或者如果您的制表符扩展不是 8 个空格,它可能会损坏。总结:使用制表符进行缩进是非常糟糕的。 永远不要这样做(需要它的语言/文件格式除外)。结束。
  • @RocketR Python 有 Pep8,该文档列出了“良好的 Python 风格”,其中明确指出 4 个空格是缩进的可接受形式。
  • Link to relevant PEP 8 section on "Tabs vs Spaces" 剧透:第一行是“空格是首选的缩进方法。”
【解决方案3】:

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

  1. 将制表符转换为空格

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

  2. 将空格转换为制表符

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

Eclipse 的 Pydev 提供了“Convert tabs to space-tabs”和“Convert space-tabs to tabs”功能。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 崇高文本的替代方案 - 转到查看 -> 缩进 -> 隐蔽缩进到空格
      【解决方案6】:

      使用IDLE 编辑器,您可以使用:

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

      【讨论】:

        【解决方案7】:

        我使用 Notepad++ 遇到了这个错误。

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

        为了解决这个问题,我只是删除了行前的制表符,然后添加了四个空格。

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            弹出相同错误时我做了什么:选择所有内容(Str + A)并按Shift + Tab。所以什么都没有缩进了。现在回到你想要缩进的行,然后按照你想要的方式放回去。

            它对我有用...

            【讨论】:

              【解决方案10】:

              我遇到了同样的错误,但无法弄清楚我做错了什么。

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

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

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

              【讨论】:

                【解决方案11】:

                有时,tab 在缩进时确实会搞砸。一种方法是显然使用tabbackspace 来正确缩进代码。

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

                一种奇怪的方式在没有其他方法的情况下对我有用,无论我收到错误的哪一行,我都将backspaced 该行转到上一行,然后按enter。它自动将行缩进以纠正位置,之后我没有收到任何错误。

                希望这会有所帮助。

                【讨论】:

                  【解决方案12】:

                  崇高文本 3

                  在 Sublime Text 中,WHILE 编辑 Python 文件:

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

                  Python.sublime-settings

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

                  【讨论】:

                    【解决方案13】:

                    我遇到了同样的问题,并使用以下 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 或任何其他为您提供替换文本工具的编辑器,您可以将所有选项卡替换为编辑器中的四个空格。

                    【讨论】:

                      【解决方案14】:

                      使用下面的autopep8 命令为我修复了它:

                       autopep8 -i my_file.py
                      

                      autopep8linked here. 的文档

                      【讨论】:

                      • 太棒了,效果很好!在ubuntu上使用'sudo apt install python3-autopep8'
                      • 它不工作..
                      【解决方案15】:

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

                      【讨论】:

                        【解决方案16】:

                        here 提出了这个问题的副本,但我想我会提供一个与现代编辑器及其提供的大量功能有关的观点。使用 python 代码,需要在 .py 文件中指定的任何内容都需要使用 tab 键或空格来指定。约定是使用四个空格作为缩进。大多数编辑器都能够在编辑器上直观地显示代码是否使用空格或制表符缩进,这对调试有很大帮助。例如,使用 atom,转到首选项然后编辑器,您可以看到以下两个选项:

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

                        如果它是使用制表符缩进的,你会看到这样的:

                        现在如果你注意到了,你可以看到在使用 tabs 时,左边有更多的错误/警告,这是因为一个叫做 pep8 pep8 documentation 的东西,它基本上是 python 的统一样式指南,所以所有开发人员大多按照相同的标准和外观编写代码,这有助于理解其他人的代码,在 pep8 中,它倾向于使用空格而不是制表符来缩进。我们可以看到编辑器显示有一个与 pep8 警告代码W191 相关的警告,

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

                        【讨论】:

                          【解决方案17】:

                          可以使用notepad++ 解决这个问题,方法是将Tabs 替换为4 个Spaces:

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

                          【讨论】:

                            【解决方案18】:

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

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

                            【讨论】:

                              【解决方案19】:

                              使用 sublime 文本编辑器时,我能够选择给我inconsistent use of tabs and spaces in indentation 错误的代码段并选择:

                              view &gt; indentation &gt; convert indentation to spaces

                              这为我解决了这个问题。

                              【讨论】:

                                【解决方案20】:

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

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

                                【讨论】:

                                  【解决方案21】:

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

                                  我正在使用 jupyter notebook,然后我将代码复制到 sublime 中。显然,当您进行特定修改(例如在函数中移动代码)时,缩进会变得混乱,这就是问题所在。

                                  所以只使用一个编辑器。如果你这样做,那么你将没有问题。

                                  【讨论】:

                                    【解决方案22】:

                                    使用pylint,它将为您提供有关您需要多少空间以及在哪里的详细报告。

                                    【讨论】:

                                      【解决方案23】:

                                      如果您使用 ATOM:

                                      转到菜单:Packages --> WhiteSpace --> 将所有制表符转换为空格

                                      【讨论】:

                                        【解决方案24】:

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

                                        【讨论】:

                                        • 我认为这是正确的解决方案。不管你使用什么编辑器,Python 对 和 4 个 的解释是不同的。
                                        【解决方案25】:

                                        对于 VSCode 用户

                                        Ctrl+Shift+P 或查看->命令面板。

                                        类型

                                        >将缩进转换为空格

                                        按 Enter。

                                        【讨论】:

                                        • 如果您更喜欢使用制表符,您可以通过重复上述说明并键入来再次转换代码:>将缩进转换为制表符
                                        • 这对我有用
                                        【解决方案26】:

                                        以下技巧对我有用:

                                        1. 复制代码并将其粘贴到记事本中。
                                        2. 然后再次从记事本中选择全部并复制代码
                                        3. 粘贴到我的views.py中
                                        4. 在views.py中选择所有新粘贴的代码并通过按键盘上的shift+tab删除所有选项卡
                                        5. 现在再次使用 Tab 键以使用正确的缩进

                                        【讨论】:

                                          【解决方案27】:

                                          SUBLIME 文本的解决方案

                                          我对这个问题的解决方案是在空闲编辑器中打开它,然后空闲编辑器会发现你的问题

                                          例如

                                          SUBLIME 文本

                                          while run:
                                          
                                              clock.tick(27)
                                              
                                              milli = clock.tick()
                                              seconds = milli/1000
                                              timeForLevel += seconds
                                              print(timeForLevel)
                                              
                                          

                                          空闲编辑器

                                          while run:
                                          
                                              clock.tick(27)
                                              
                                                 milli = clock.tick()
                                              seconds = milli/1000
                                              timeForLevel += seconds
                                              print(timeForLevel)
                                          

                                          我并不是说你应该只使用空闲的编辑器。我的意思是,如果您遇到该错误,您应该检查空闲编辑器

                                          【讨论】:

                                          猜你喜欢
                                          • 2012-10-10
                                          • 2015-08-28
                                          • 2019-04-15
                                          • 2020-01-23
                                          • 2019-07-24
                                          • 1970-01-01
                                          • 2020-08-10
                                          • 1970-01-01
                                          • 1970-01-01
                                          相关资源
                                          最近更新 更多