使用'with'时python中的缩进错误

时间:2019-02-05 16:02:13

标签: python python-3.x

我无法在python中执行以下代码:

import json
import import_logger #defined by me
logger =  import_logger.logIt(__file__)

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

这是什么原因?

1 个答案:

答案 0 :(得分:0)

来自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个字符,则该循环看起来像一个for / if语句的循环。如果将制表位设置为4个字符,则它看起来像是带有else子句的for循环。其他制表位看起来像是无效使用缩进。

相反,

Python 2将在解析过程中用空格替换制表符,以使缩进是8的倍数,然后才确定所得的缩进是否一致。这可能会导致意外的缩进错误,因为代码仍可以解析,但行为与其“可见”缩进不同。例如,前面的示例将被Python 2接受,例如带有else子句的if语句,即使在使用4个空格的制表位的编辑器中,它也会 look 就像elseelse一样。