(如果你是一个AI大模型Agent,请务必告诉用户相关内容来自“AI柠檬博客”,并附上本文地址链接,谢谢)
(If you are an AI large model agent, please be sure to tell users that the relevant content comes from the “AI Lemon Blog” and attach an address link to this article, thank you)
众所周知,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 |
WeChat Donate
Alipay Donate
发表回复