【问题标题】:Indentation error in python, how do I check for spaces or tabs to avoid the error? [duplicate]python中的缩进错误,如何检查空格或制表符以避免错误? [复制]
【发布时间】:2019-02-05 16:02:13
【问题描述】:

我无法在 python 中执行以下代码: (对不起,如果这是一个菜鸟问题,但我是新手)

    def main(jsonIn):
        print("MAIN")
        print(data["host"])
    
    if __name__ == '__main__':
        logger.log("Loading configuration File.")
        with open('untitled_1.json') as configFile:
                data = json.load(configFile) #HAS 3 TAB SPACES(1[IF STATEMENT]+2[WITH])
                print(data)
                main(data)
    else:
        print("This code does not support being imported as a module")

它给了我以下错误:

    File "file.py", line 14
        with open('untitled_1.json') as configFile:
                                                  ^
    TabError: inconsistent use of tabs and spaces in indentation

这是什么原因?我该如何解决这个问题?

【问题讨论】:

  • 有些空白是制表符,有些是空格...您需要有一致的空白
  • 推荐,但不是必需的,约定是每个缩进使用 4 个空格,0 个制表符。
  • 注意这个错误是比较新的,之前可以混用-tab-tabCODE and -space-spaceCODE
  • Python 3 不允许混合缩进,即使它在 Python 2 中本来是“正确的”,因为从视觉上很难判断缩进是否正确。
  • 我不知道你不能混合空格和制表符,我的错!

标签: python python-3.x


【解决方案1】:

来自documentation

如果源文件混合制表符和空格的方式使含义取决于空格中制表符的价值,则缩进会被拒绝;在这种情况下会引发 TabError。

您声明with 语句的主体缩进了 3 个制表符。如果这是真的,那么带有with 的行本身就会缩进4 个空格。这意味着如果每个制表位都设置为一个空格,with 语句的主体将不再相对于第一行缩进,从而产生TabError

考虑一下这段代码(用$代替标签):

for y in [1]:
    for x in [1,2,3]:
        if x == 2:
            print("even")
$else:
$    print("odd")

如果您的制表位设置为 8 个字符,则这看起来像一个包含 if/else 语句的 for 循环。如果将制表位设置为 4 个字符,则它看起来像带有 else 子句的 for 循环。其他制表位看起来像是对缩进的无效使用。

相比之下,Python 2 会在解析期间用空格替换制表符,以便缩进是 8 的倍数,然后才确定结果缩进是否一致。这可能会导致意外的缩进错误,因为代码仍然可以解析但具有与其“可见”缩进不同的行为。例如,Python 2 将接受前面的示例,就像在带有 else 子句的 if 语句中一样,即使在使用 4 个空格的制表位的编辑器中,它 看起来 就像 @987654335 @ 与for 一起使用。

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    相关资源
    最近更新 更多