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

0 投票
1 回答
649 浏览
提问于 2025-04-29 09:36

我在使用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,所以如果我漏掉了什么简单的东西,请多多包涵。我到处找这个问题的答案,但没有找到。

暂无标签

1 个回答

0

我怀疑你给我们的代码和你实际运行的代码不太一样。在你的真实 Python 脚本中,可能有几行空行把不同的函数分开(这没问题),但在你粘贴的代码部分里没有这些空行。可能是因为格式的问题或者其他原因。

不过,在 Python 中,空行表示你已经完成了前面的部分。这在使用交互式解释器时(比如在 SublimeREPL 中)特别重要。空格和缩进是很关键的。在这种情况下,它只是把你的文本传给了解释器,这和你自己复制粘贴是一样的。解释器看到在 def __copy__(self) 之前有一个空行,就认为应该执行这个类的定义。然后,它看到 def __copy__(self),注意到它有一些缩进。这就导致了你收到的 IndentationError 错误。

你可以在 SublimeREPL 的 GitHub 页面上评论一下这个已经存在的 bug,或者在你的代码中不要使用空行。

撰写回答