交互式提示处的空行规则

mil*_*cic 7 python interactive command-prompt

我想知道为什么在交互式提示之间以及从shell作为可执行文件运行程序时,Python中的空白行有不同的规则.

由于空白行被忽略,我喜欢大量使用它们.但是,在交互式提示中,空行用于终止循环.因此,当我将一大块代码粘贴到交互式提示中时,我一直遇到缩进错误,因为在整个循环中我会有空行.因此,这使得交互式调试/开发过程有些繁琐.使用#而不是空行有帮助,但我喜欢我的空白行.

更令人讨厌的是提示之间的不同行为(例如python和ipython).在python交互式提示符会给我一个错误,我希望它,ipython将继续执行缩进代码,就好像它不是抱怨的循环的一部分.

我觉得有一个简单的解决方案,但我不知道.我正在使用vi进行编辑和python/ipython提示.谢谢.

Wyr*_*ood 5

...为什么在交互式提示符和从 shell 运行程序时,Python 中的空行规则不同

因为,解释器会在您按下回车键后立即执行,但它需要空行来知道您的函数、循环、if 语句或其他缩进块已完成。如果编写一个函数,如果在函数的最后一行之前添加空行,则不需要(实际上不会起作用)。在这种情况下,需要空行来表示函数结束。

例如,您可以从 shell 执行没有空行的脚本

for i in range(3):
    print i
a = 1000
print a
Run Code Online (Sandbox Code Playgroud)

会产生

for i in range(3):
    print i
a = 1000
print a
Run Code Online (Sandbox Code Playgroud)

但是如果你将其粘贴到解释器中,你会得到

$ python test.py
0
1
2
1000
Run Code Online (Sandbox Code Playgroud)

如果添加一个空行来表示循环结束

for i in range(3):
    print i

a = 1000
print a
Run Code Online (Sandbox Code Playgroud)

并将其粘贴到解释器中,

>>> for i in range(3):
...     print i
... a = 1000
  File "<stdin>", line 3
a = 1000
^
SyntaxError: invalid syntax
>>> print a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
Run Code Online (Sandbox Code Playgroud)

并且该空行必须是空白,即使是空格(可能由编辑器自动添加)也会导致解释器失败。

如果要将类粘贴到解释器中,那么您不希望任何行之间有任何空格,包括方法之间。然而,这与 PEP8 产生了冲突,这意味着您可以遵循 PEP8,或者与解释器兼容,但不能两者兼而有之。

因此,如果您希望能够将代码复制并粘贴到标准 python 解释器中,则需要一组略有不同的规则。

  • 用两个空行包围顶级函数和类定义。
  • 顶级模块代码(函数或类之外)需要一个空行来结束缩进块,例如 for 循环、try/ except 或 if 语句。
  • 函数、类或方法中不得使用空行(\ 或 # 除外)。

坚持这些,您将保留粘贴到解释器中的能力。但是,对于类,您不会严格遵守 PEP8,因为方法之前和之后都需要空行。


mac*_*mac 3

PEP\xc2\xa08定义如何使用空行:

\n
\n

空行

\n

用两个空行分隔顶级函数和类定义。\n类内的方法定义由一个空行分隔。

\n

可以(谨慎地)使用额外的空行来分隔相关函数组。在一堆相关的\none-liners(例如一组虚拟实现)之间可以省略空行。

\n

在函数中谨慎使用空行来指示逻辑部分。

\n

Python 接受 control-L(即 ^L)换页字符作为空白;\n许多工具将这些字符视为页面分隔符,因此您可以使用它们\n来分隔文件的相关部分的页面。请注意,某些编辑器\n和基于 Web 的代码查看器可能无法将 control-L 识别为换页符\n并且会在其位置显示另一个字形。

\n
\n

如果您坚持使用 PEP,我相信空行可能在交互式控制台中产生问题的唯一实例是“函数中用于指示逻辑部分的空行”。

\n

不过你可以像这样绕过这个问题:

\n
>>> def a():\n...     print \'foo\'\\\n...\n...     print \'bar\'\n...\n>>> a()\nfoo\nbar\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,使用\\而不是按照#您在问题中建议的方式将空白行...留空(如上一行\\所示

\n

  • 我喜欢Python。但。这个恼人的错误特性——即解释模式和批处理模式之间的语法不兼容——让经验丰富的Python爱好者和新手都感到沮丧。很明显,将相同的正确代码粘贴到解释脚本的同一程序中应该会得到相同的效果,但 Python 甚至在 3.4 中仍然违背了这种期望。考虑到几乎与我共事过的每个 Python 程序员都对这种行为感到震惊(许多人转而使用 IPython 来避免这种情况),核心 Python 团队竟然不费心去清理这个问题,这是令人难以理解的。 (3认同)