Python IDLE允许不正确的缩进?

时间:2016-12-03 04:42:06

标签: python python-3.5 python-idle python-interactive ident

虽然looking at an answer given by wwii,我评论他的缩进说这是错误的。然而,在我的IDLE中运行他的代码后,我发现它运行顺利。

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

>>> def foo():
    return 0

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

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

>>> foobar()
5
>>> 

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

enter image description here

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

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

  

关键字def引入了一个函数定义。它必须后跟函数名称和带括号的形式参数列表。构成函数体的语句从下一行开始,必须缩进

(强调我的)

为什么在IDLE中允许这种缩进,但在常规脚本中完全关闭?这是故意的吗?如果是这样,这种行为是否记录在某处?

3 个答案:

答案 0 :(得分:2)

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

>>> def foo():
    return 0

IDLE打印出而Python:

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

看到返回前的四个空格,但由于它们与最左边的列对齐而不是以三个点和一个空格为前缀,如果您希望代码缩进更多,则空格似乎不存在。 / p>

答案 1 :(得分:1)

你在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())

回答"为什么IDLE缩进是正确的?"

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

>>> <-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

答案 2 :(得分:1)

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

要查看并思考代码的确如何工作,请删除所有>>>提示。为清楚起见,我们也会删除打印结果。

现在看起来像普通的Python代码:

def foo():
    return 0

foo()

def bar():
    return foo() + 5

bar()

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

foobar()

因此,IDLE与任何其他Python解释器没有什么不同,它只是将>>>提示符放在第一行上的方式让人感到困惑。如果你考虑一下这四个字符被移除后代码的外观,那么这一切都会更有意义。