【问题标题】:Improper indentation allowed in Python IDLE?Python IDLE 中允许不正确的缩进?
【发布时间】:2017-04-18 01:53:29
【问题描述】:

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 甚至会在我的程序运行之前引发错误,告诉我我忘记缩进一个块:

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

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

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

(强调我的)

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

【问题讨论】:

  • 我猜提示 >>> 在处理之前已从第一行删除。虽然很烦人。
  • @wwii 当然是。但这似乎比烦人更令人困惑。
  • 我被曝光为一个闲散的程序员。
  • 您最初的困惑是为什么 IDLE 在 shell 中使用 8 空格制表符缩进——所以后续行看起来是物理缩进的。我希望有一天能将 '>>> ' 提示与其他符号一起放在一个明显的空白处。然后缩进将与编辑器中的空格缩进相同,并且可以选择在没有提示的情况下保存或复制代码,因此可以从编辑器窗口运行。

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


【解决方案1】:

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

>>> def foo():
    return 0

IDLE 打印,而 Python:

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

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

【讨论】:

  • “代码是正确的,但 IDLE REPL 不像 Python” - 抱歉,我不太理解你的那句话。你能再解释一下吗?
  • @leaf 标准的 REPL 是面向行的:你向 Python 提交物理行,历史机制调用物理行。 IDLE 的 Shell 是面向语句的:你向 Python 提交完整的语句(并且可以编辑整个多行语句。历史机制会调用完整的语句。
【解决方案2】:

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

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

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

def foo():
    return 0

foo()

def bar():
    return foo() + 5

bar()

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

foobar()

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

【讨论】:

    【解决方案3】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-12
      • 2013-06-11
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多