mil*_*cic 7 python interactive command-prompt
我想知道为什么在交互式提示之间以及从shell作为可执行文件运行程序时,Python中的空白行有不同的规则.
由于空白行被忽略,我喜欢大量使用它们.但是,在交互式提示中,空行用于终止循环.因此,当我将一大块代码粘贴到交互式提示中时,我一直遇到缩进错误,因为在整个循环中我会有空行.因此,这使得交互式调试/开发过程有些繁琐.使用#而不是空行有帮助,但我喜欢我的空白行.
更令人讨厌的是提示之间的不同行为(例如python和ipython).在python交互式提示符会给我一个错误,我希望它,ipython将继续执行缩进代码,就好像它不是抱怨的循环的一部分.
我觉得有一个简单的解决方案,但我不知道.我正在使用vi进行编辑和python/ipython提示.谢谢.
...为什么在交互式提示符和从 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 解释器中,则需要一组略有不同的规则。
坚持这些,您将保留粘贴到解释器中的能力。但是,对于类,您不会严格遵守 PEP8,因为方法之前和之后都需要空行。
PEP\xc2\xa08定义如何使用空行:
\n\n\n空行
\n用两个空行分隔顶级函数和类定义。\n类内的方法定义由一个空行分隔。
\n可以(谨慎地)使用额外的空行来分隔相关函数组。在一堆相关的\none-liners(例如一组虚拟实现)之间可以省略空行。
\n在函数中谨慎使用空行来指示逻辑部分。
\nPython 接受 control-L(即 ^L)换页字符作为空白;\n许多工具将这些字符视为页面分隔符,因此您可以使用它们\n来分隔文件的相关部分的页面。请注意,某些编辑器\n和基于 Web 的代码查看器可能无法将 control-L 识别为换页符\n并且会在其位置显示另一个字形。
\n
如果您坚持使用 PEP,我相信空行可能在交互式控制台中产生问题的唯一实例是“函数中用于指示逻辑部分的空行”。
\n不过你可以像这样绕过这个问题:
\n>>> def a():\n... print \'foo\'\\\n...\n... print \'bar\'\n...\n>>> a()\nfoo\nbar\nRun Code Online (Sandbox Code Playgroud)\n请注意,使用\\而不是按照#您在问题中建议的方式将空白行...留空(如上一行\\所示)。
| 归档时间: |
|
| 查看次数: |
3010 次 |
| 最近记录: |