类python中的IndentationError

Erv*_*van 1 python indentation python-3.x

我喜欢这样的代码

# -*- coding: utf-8 -*-

class OP(object):

  def RECEIVE_MESSAGE(self):
      print("done")


  def NOTIFIED_INVITE_INTO_GROUP(self):
    print("done")
Run Code Online (Sandbox Code Playgroud)

但当我运行这个我有一些错误

Traceback (most recent call last):
File "run.py", line 2, in <module>
  from van import ERVAN
File "/home/server/.pub/van.py", line 4, in <module>
  from op import OP
File "/home/server/.pub/op.py", line 9
  def NOTIFIED_INVITE_INTO_GROUP(self):
                                    ^
IndentationError: unindent does not match any outer indentation level
Run Code Online (Sandbox Code Playgroud)

对此有何解决方案?它只有10条线,但我的脑海里浮现

Ric*_*lis 5

这是代码,用圆点代替空格:

#.-*-.coding:.utf-8.-*-

class.OP(object):

..def.RECEIVE_MESSAGE(self):
......print("done")

..def.NOTIFIED_INVITE_INTO_GROUP(self):
....print("done")
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个print("done")语句缩进了6个空格 - 将其更改为4以解决问题.

更好的是,根据PEP 8的建议,更改所有缩进,使它们是4个空格的倍数(即0,4,8,12等)

#.-*-.coding:.utf-8.-*-

class.OP(object):
....def.RECEIVE_MESSAGE(self):
........print("done")

....def.NOTIFIED_INVITE_INTO_GROUP(self):
........print("done")
Run Code Online (Sandbox Code Playgroud)

更多细节,来自Python:关于缩进的神话

编译器如何解析缩进?解析是明确定义的,非常简单.基本上,对缩进级别的更改将作为标记插入到标记流中.

词法分析器(tokenizer)使用堆栈来存储缩进级别.在开始时,堆栈仅包含值0,这是最左边的位置.每当嵌套块开始时,新的缩进级别被推送到堆栈上,并且"INDENT"标记被插入到令牌流中,该令牌流被传递给解析器.连续不能有多个"INDENT"标记.

当遇到具有较小缩进级别的行时,将从堆栈中弹出值,直到值位于顶部,该值等于新缩进级别(如果未找到,则发生语法错误).