2016-12-03 95 views
0

虽然looking at an answer given by wwii,我评论他的缩排说这是错的。然而,在我的IDLE中运行他的代码后,我发现它运行顺畅。Python 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,但在楷书完全关闭?这是故意的吗?如果是这样,这种行为记录在某个地方?

+0

我猜测,在处理之前,提示符“>>>”会从第一行中除去。虽然这很烦人。 – wwii

+0

@wwii好的。但它似乎比烦人更混乱。 –

+1

我已经作为一个空闲的编码器被暴露。 – wwii

回答

1

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

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

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

def foo(): 
    return 0 

foo() 

def bar(): 
    return foo() + 5 

bar() 

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

foobar() 

那么IDLE是没有任何其他的Python解释器不同,它只是它把>>>提示在第一行的方式只有这使得它混乱。如果你考虑如何删除这四个字符代码,它将更有意义。

2

的代码是正确的,但空闲REPL是不喜欢的Python:

>>> def foo(): 
    return 0 

IDLE打印的是,尽管Python的:

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

请参阅返回之前的四个空间是有的,但他们与最左边的列对齐,而不是以三个点和一个空格为前缀,如果您希望代码缩进更多,则空格似乎不存在。

+0

_“代码是正确的,但空闲REPL是不是像Python”_ - 对不起,我没有完全遵循你的这句话。你能解释一下吗? –

+0

@leaf标准的REPL是面向行的:您向Python提交物理线路并且历史机制调用物理线路。 IDLE的Shell是以语句为导向的:您向Python提交完整的语句(并且可以编辑整个多行语句,历史机制回顾完整的语句。 –

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. 

所以下一个代码将会有E更正缩进:

>>> def foo(): 
    return 0 

因为它是一个等同于下面的代码写在脚本文件:

def foo(): 
    return 0