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