众所周知,python是一个基于缩进而不是大括号的语言,因而写python代码有需要使用游标卡尺的梗。我在写python代码的时候,没少掉进这个坑里面。基本上只要前一行结尾出现冒号,下一行必然添加一个单位的缩进,直到块结束。我们可以使用空格(Space)和制表符(Tab)来进行缩进,然而这里面有一些会经常遇到的坑。
TabError: inconsistent use of tabs and spaces in indentation
一般来说,出现这种报错,是因为两种缩进方式混用导致的,一个Python文件中只能使用一种缩进方式,要么Space要么Tab。我在写某机器学习代码的时候,由于部分代码直接复制了别人的,导致我一直用Tab制表符而粘贴过来的是4个Space空格,看起来没区别,但是缩进方式不一样,然后就出现了上述报错。
IndentationError: expected an indented block
这种报错让我在刚开始想了很久,一看是缩进问题报错,我就检查缩进格式是否统一,缩进的结构是否正确等,然而并没有发现问题,然后我开始方了……
后来发现,这是一个跟C类语言不一样而且有点坑的一点。报错是因为,报错行的前一行有一个已经定义好的但是没有实现的函数,也就是类似如下的效果:
def TestModel(self): # 测试检验模型效果 def model(self): # 返回model return self._model
这时候,def model这一行就会被报错,并且位置指向def的字母f,我就很奇怪为什么说字母f这里出错了。解决方法就是,对于尚未实现的函数,随意添加一行无关紧要的代码先占坑,比如:
def TestModel(self): # 测试检验模型效果 print('test') def model(self): # 返回model return self._model
这样一来,代码就可以顺利运行测试了。这个问题对于刚刚脱离C类语言而使用python的人来说,简直让人不可思议。
应该是python解释器将def model当成了def TestModel的子块了,然而子块却少了一级缩进,所以就报错。
========== 2017-08-28 更新 ==========
经评论区的童鞋提醒,占坑代码还可以使用Python中保留的关键字pass来做,这样就做到了真正的无关紧要,而且很明确:
def TestModel(self): # 测试检验模型效果 pass def model(self): # 返回model return self._model
====================================
如果各位看官也遇到涉及到python缩进问题的话,欢迎在评论区留言讨论。
版权声明本博客的文章除特别说明外均为原创,本人版权所有。欢迎转载,转载请注明作者及来源链接,谢谢。本文地址: https://blog.ailemon.net/2017/08/26/python-indentation-problem/ All articles are under Attribution-NonCommercial-ShareAlike 4.0 |
“Python缩进问题”上的2条回复
函数里通常用保留字「pass」作 placeholder,比其他语句更好,真正做到无关紧要。
嗯嗯,这个好,我还没注意到这个关键字,哈谢啦,我补充一下。