Python缩进错误:Sublime Text 2使用SublimeREPL



我正在尝试评估SublimeREPL中的一些Python命令,但每个新命令都会导致缩进错误。如果我一次只发送一行代码,代码就会工作。

下面是一个例子的尝试。。。

class Array(object):
    def __init__(self, length = 0, baseIndex = 0):
        assert(length >= 0)
        self._data = [0 for i in range(length)]
        self._baseIndex = baseIndex
    def __copy__(self):
        result = Array(len(self._data))
        for i, datum in enumerate(self._data):
            result._data[i] = datum
        result._baseIndex = self._baseIndex
        return result
    def __len__(self):
        return len(self._data)

其评估为…

IndentationError: unexpected indent
>>> class Array(object):
...     def __init__(self, length = 0, baseIndex = 0):
...         assert(length >= 0)
...         self._data = [0 for i in range(length)]
...         self._baseIndex = baseIndex
... 
>>>     def __copy__(self):
  File "<stdin>", line 1
    def __copy__(self):
    ^
IndentationError: unexpected indent
>>>         result = Array(len(self._data))
  File "<stdin>", line 1
    result = Array(len(self._data))
    ^
IndentationError: unexpected indent
>>>         for i, datum in enumerate(self._data):
  File "<stdin>", line 1
    for i, datum in enumerate(self._data):
    ^
IndentationError: unexpected indent
>>>             result._data[i] = datum
  File "<stdin>", line 1
    result._data[i] = datum
    ^
IndentationError: unexpected indent
>>>         result._baseIndex = self._baseIndex
  File "<stdin>", line 1
    result._baseIndex = self._baseIndex
    ^
IndentationError: unexpected indent
>>>         return result
  File "<stdin>", line 1
    return result
    ^
IndentationError: unexpected indent
>>> 
>>>     def __len__(self):
  File "<stdin>", line 1
    def __len__(self):
    ^
IndentationError: unexpected indent
>>>         return len(self._data)
  File "<stdin>", line 1
    return len(self._data)
    ^
IndentationError: unexpected indent

但是,如果我在每行前面加上一些行注释字符,除了后面的"…………"之外,它可以正常工作

class Array(object):
    def __init__(self, length = 0, baseIndex = 0):
        assert(length >= 0)
        self._data = [0 for i in range(length)]
        self._baseIndex = baseIndex
#
    def __copy__(self):
        result = Array(len(self._data))
        for i, datum in enumerate(self._data):
            result._data[i] = datum
        result._baseIndex = self._baseIndex
        return result
#
    def __len__(self):
        return len(self._data)
#

在它被发送后,我必须切换到REPL窗口,并点击行上的回车键"…………"进行评估。

>>> class Array(object):
    def __init__(self, length = 0, baseIndex = 0):
        assert(length >= 0)
        self._data = [0 for i in range(length)]
        self._baseIndex = baseIndex
#
    def __copy__(self):
        result = Array(len(self._data))
        for i, datum in enumerate(self._data):
            result._data[i] = datum
        result._baseIndex = self._baseIndex
        return result
#
    def __len__(self):
        return len(self._data)
#
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 

我是Python的新手,所以如果我错过了一些非常简单的东西,我很抱歉。我试着到处寻找这个答案。

我怀疑您向我们展示的代码与您实际运行的代码不完全一样。在实际的python脚本中,可能有几行换行符将def彼此分隔开(这很好),但它们不在这里粘贴的代码部分。也许是因为这里的格式问题或其他什么。

但是,在Python中,一个空行表示您已经完成了上一节的内容。这只在使用交互式解释器时才重要(如SublimeRPL)。空格和缩进很重要。在这种情况下,它只是将您的文本转移到解释器,这与您自己剪切和粘贴文本时发生的情况相同。它看到def __copy__(self)之前的换行符,并假设它应该评估该类定义。然后,它看到def __copy__(self),并注意到它有一些空间缩进。这导致您收到的IndentationError

要么在SublimeREPL的github帐户中对已经存在的错误发表评论,要么不要在代码中使用空行。

最新更新