Python IndentationError:Sublime Text 2使用SublimeREPL

时间:2014-10-24 01:27:56

标签: python sublimetext2 read-eval-print-loop sublimerepl

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

这是一个例子的尝试......

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的新手,所以如果我遗漏了一些非常简单的话,我会道歉。我试着到处寻找这个答案。

1 个答案:

答案 0 :(得分:0)

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

但是,在Python中,空行表示您已完成上一部分。这仅在使用交互式解释器时很重要(如SublimeREPL)。空间和缩进很重要。在这种情况下,它只是将您的文本传输到解释器,如果您自己剪切并粘贴它就会发生同样的事情。它在def __copy__(self)之前看到换行符,并假设它应该评估该类定义。然后,它会看到def __copy__(self),并注意到它有一些空格缩进。这导致IndentationError您正在接收。

在SublimeREPL的github帐户中对此already existing bug进行评论,或者在代码中不使用空行。