Python IDLE 允许不正确的缩进?

Improper indentation allowed in Python IDLE?

虽然,我对他的缩进发表评论说这是错误的。然而,在我的IDLE中运行他的代码后,我发现它运行很顺利。

我试了几个例子,只是为了确保得到正确的结果:

>>> def foo():
    return 0

>>> foo()
0
>>> def bar():
    return foo() + 5

>>> bar()
5
>>> def foobar():
    return foo() + bar()

>>> foobar()
5
>>> 

如您所见,所有 运行 都很好。如果我在常规脚本中尝试相同的操作,Python 会在我的程序运行之前引发错误,告诉我我忘记缩进一个块:

为什么这种缩进在交互式IDLE中允许,而在正文中却不允许?我查看了 IDLE 的文档,更具体地说是 25.5.2.1 Automatic indentation 部分,这对找到答案没有帮助。

此外,the Python documenation on functions 声明函数体必须缩进:

The keyword def introduces a function definition. It must be followed by the function name and the parenthesized list of formal parameters. The statements that form the body of the function start at the next line, and must be indented.

(强调我的)

为什么在IDLE中允许这种缩进,而在正则中却完全关闭?这是故意的吗?如果是这样,这种行为是否记录在某处?

代码是正确的,但 IDLE REPL 不像 Python:

>>> def foo():
    return 0

IDLE 打印出 Python:

>>> def foo():
...     return 0

看到 return 之前的四个 space 在那里,但由于它们与最左边的列对齐,而不是用三个点和一个 space 作为前缀,spaces 似乎不存在,如果您希望代码缩进更多。

您在 IDLE 中的缩进是正确的,但在您的脚本中是错误的。

在IDLE中return 0前有4个空格。而在你的脚本中没有。

您的脚本应如下所示:

def foo():
    return 0

def bar():
    return foo() + 5

def foobar():
    return foo() + bar()

print(foo())
print(bar())
print(foobar())

回答"Why IDLE indentation is correct?"

它使用>>>标记作为下一个命令输入的开始。这是标准方法。它(在变体中)无处不在。

>>> <-start of the line. Zero spaces.
<-start of the line. Zero spaces.

所以下一段代码的缩进是错误的:

>>> def foo():
return 0

因为相当于脚本文件中写下一段代码:

def foo():
return 0

但是

>>> <-start of the line. Zero spaces.
    <-start of the block. Indent 4 spaces.

所以下一个代码将有正确的缩进:

>>> def foo():
    return 0

因为相当于脚本文件中写下一段代码:

def foo():
    return 0

你在IDLE中看到的>>>只是一个提示。纯属巧合,这个提示恰好是四个字符长,而你恰好也用四个空格缩进你的代码。

为了查看和思考代码的实际工作原理,让我们删除所有 >>> 提示。为清楚起见,我们也将删除打印的结果。

现在看起来完全正常 Python 代码:

def foo():
    return 0

foo()

def bar():
    return foo() + 5

bar()

def foobar():
    return foo() + bar()

foobar()

所以 IDLE 与任何其他 Python 解释器没有什么不同,这只是它将 >>> 提示 放在第一行的方式 它令人困惑。如果您考虑删除这四个字符后代码的外观,一切都会更有意义。