我正在尝试评估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帐户中对已经存在的错误发表评论,要么不要在代码中使用空行。