分类
Python学习

Python缩进问题

(在苹果系统下,如果文章中的图片不能正常显示,请升级Safari浏览器到最新版本,或者使用Chrome、Firefox浏览器打开。)

众所周知,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

关注“AI柠檬博客”微信公众号,及时获取你最需要的干货。


“Python缩进问题”上的2条回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

5 × 3 =

如果您是第一次在本站发布评论,内容将在博主审核后显示,请耐心等待