首页 > 解决方案 > python中的缩进错误,如何检查空格或制表符以避免错误?

问题描述

我无法在 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

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

标签: pythonpython-3.x

解决方案


文档

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

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

考虑这段代码(用 a 替换标签$):

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

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

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


推荐阅读