为什么python缩进没有抛出错误?

为什么python缩进没有抛出错误?,python,coding-style,indentation,pep8,pep,Python,Coding Style,Indentation,Pep8,Pep,我们最近在python脚本中发现了一个bug,并由其他人系统上的同事修复(测试、提交和推送)。当时,似乎什么都没有发生。然而,当我在emacs中启动脚本时,我注意到缩进不正确。以下是令人反感的台词: $ cat -T -E poc.py | grep -nC 3 -F 'up_con not in check' 448- up_cons = [up_con[0].encode('utf-8') for up_con in up_cons if up_

我们最近在python脚本中发现了一个bug,并由其他人系统上的同事修复(测试、提交和推送)。当时,似乎什么都没有发生。然而,当我在emacs中启动脚本时,我注意到缩进不正确。以下是令人反感的台词:

$ cat -T -E poc.py | grep -nC 3 -F 'up_con not in check'
448-                        up_cons = [up_con[0].encode('utf-8') for up_con in up_cons if up_con and up_con[0]]$
449-^I^I    logger.debug("Got parent concepts %s", up_cons)$
450-                    for up_con in up_cons:$
451:^I^I^Iif up_con != con and up_con not in check_cons:$
452-                            check_cons.append(up_con)$
453-                        idx_con_map[i][up_con] = 1$
454-$
那些不知道的人,
^I
意味着一个硬标签,
$
意味着 下线

在该脚本上运行测试时得到了正确的输出。当我注意到缩进水平的混乱时,我自然认为这些测试是错误的。但是,将缩进修复回4-空格规则:

$ cat -T -E poc.py | grep -nC 3 -F 'up_con not in check'
448-                        up_cons = [up_con[0].encode('utf-8') for up_con in up_cons if up_con and up_con[0]]$
449-                    logger.debug("Got parent concepts %s", up_cons)$
450-                    for up_con in up_cons:$
451:                        if up_con != con and up_con not in check_cons:$
452-                            check_cons.append(up_con)$
453-                        idx_con_map[i][up_con] = 1$
454-$
导致了同样的处决。以前没有抛出错误,这次没有观察到程序执行中的任何更改

我的问题是,为什么?python不应该大声说有不同级别的缩进等吗

以下是每行的缩进级别:

Line - with 4-spaces - with tabs
448  -     6         -      6
449  -     5         -      3 <- should cause an error
450  -     5         -      5
451  -     6         -      3 <- shouldn't produce correct outputs
452  -     7         -      7
453  -     6         -      6
行-带4个空格-带制表符
448  -     6         -      6

449-5-3我不知道如何检查这一点,但是标签是否解释为8个空格而不是4个空格?@Frito这会随着系统的不同而变化吗?或者pythonshell也有这样的命令行参数吗?我不确定它是系统到系统还是python版本。如果我没记错的话,python的旧版本将选项卡视为8个空格。这就是PEP8建议使用4个空格而不使用制表符的原因之一。我知道你可以用python-tt/path/to/script.py运行你的应用程序,让它们在制表符和空格混合时抛出错误。抱歉,我不能给您指出一个困难的解决方案:-(.查看PEP8规范的缩进部分了解更多信息:如果第447行(此处未显示)是
If:
语句(或循环,或
with
语句,等等),则第448行比第449行缩进得多是完全可以接受的。@JohnGordon if语句是第445行。#446和#447从sqlite游标中获取数据/行(缩进与#448相同).我不知道如何检查这个,但是制表符是否解释为8个空格而不是4个空格?@Frito这不会随着系统的不同而改变吗?或者python shell是否也有这样的命令行参数?我不确定它是系统到系统还是python版本。如果我正确地回忆起python的旧版本,将制表符处理为8个空格。这是e原因PEP8建议使用4个空格,而不使用任何制表符。我知道你可以用
python-tt/path/to/script.py运行你的应用程序,让它们在制表符和空格混合时抛出错误。很抱歉,我不能给你指出一个困难的解决方案:-(。查看PEP8规范的缩进部分了解更多信息:如果第447行(此处未显示)是
if:
语句(或循环,或带有
语句的
,等等),那么第448行比第449行缩进得多是完全可以接受的。@JohnGordon if语句是第445行。#446和#447从sqlite游标获取数据/行(缩进与#448相同)。