我想知道为什么在交互式提示符和从shell作为可执行文件运行程序时,Python中的空白行有不同的规则。
由于空白行被忽略,我喜欢大量使用它们。但是,在交互式提示中,空行用于终止循环。因此,当我将一大块代码粘贴到交互式提示中时,我一直遇到缩进错误,因为在整个循环中我会有空行。因此,这使得交互式调试/开发过程有些繁琐。使用#而不是空行有帮助,但我喜欢我的空行。
更令人讨厌的是提示之间的不同行为(例如python和ipython)。如果python交互式提示符会给我一个错误,我会期待它,ipython将继续执行缩进代码,就像它不是抱怨一样不是循环的一部分。
我觉得那里有一个简单的解决方案,但我不知道。我正在使用vi进行编辑和python / ipython提示。感谢。
答案 0 :(得分:3)
...为什么在交互式提示符和从shell运行程序时Python中的空白行有不同的规则
因为,解释器会在您返回后立即尝试执行,但需要空白行才能知道您的函数,循环,if语句或其他缩进块是否已完成。如果在函数的最后一行之前添加空行,如果编写函数,则不需要(实际上不会工作)。在这种情况下,需要空行来表示功能的结束。
您可以执行shell中没有空行的脚本,例如
for i in range(3):
print i
a = 1000
print a
会产生
$ python test.py
0
1
2
1000
但如果你将它粘贴在翻译中,你就会得到
>>> 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
如果添加空行以表示循环结束
for i in range(3):
print i
a = 1000
print a
并将其粘贴到解释器中,
>>> for i in range(3):
... print i
...
0
1
2
>>> a = 1000
>>> print a
1000
该空白行必须为空白,即使空格(可能由编辑器自动添加)也会导致解释程序失败。
如果要将类粘贴到解释器中,那么您不希望任何行之间有任何空格,包括方法之间。这引起了与PEP8的冲突,但是,这意味着,您可以遵守PEP8,也可以兼容解释器,但不能同时兼容。
因此,如果您希望能够将代码复制并粘贴到标准python解释器中,那么您需要一组略有不同的规则。
坚持这些并且你将保留粘贴到解释器的能力。但是,对于某个班级,您不会严格地将PEP8作为方法之前和之后的空白行required。
答案 1 :(得分:2)
PEP8定义了如何使用空行:
空行
使用两个空行分隔顶级函数和类定义。 类中的方法定义由单个空行分隔。
可以使用额外的空白行(谨慎地)来分离相关的组 功能。在一堆相关之间可以省略空行 单行(例如一组虚拟实现)。
谨慎地在函数中使用空行来表示逻辑部分。
Python接受control-L(即^ L)换页符作为空格; 许多工具将这些字符视为页面分隔符,因此您可以使用它们 分隔文件相关部分的页面。请注意,一些编辑 和基于Web的代码查看器可能无法将control-L识别为换页 并将在其位置显示另一个字形。
如果您坚持使用PEP,我认为唯一可能在交互式控制台中产生空白行的实例是“功能中的空行以表示逻辑部分”。
你可以绕过这样的问题:
>>> def a():
... print 'foo'\
...
... print 'bar'
...
>>> a()
foo
bar
修改:请注意,如您在问题中所建议的那样,使用\
代替#
会使空行显示为空白(\
为在上一个行。)
HTH!
答案 2 :(得分:1)
ipython v5现在可以处理缩进的空白多线:
http://blog.jupyter.org/2016/07/08/ipython-5-0-released/
来自上述博文:
prompt_toolkit包是Jonathan的一个很棒的库 Slenders最近达到1.0版本。超越readline, prompt_toolkit提供了许多用于编辑文本的高级功能 终端显着改善用户体验。因为它是一个 跨平台库,Linux / Unix,macOS和Windows上的所有用户 从这些改进中受益。感谢prompt_toolkit,现在就是IPython 支持:
- 键入时语法突出显示
- 真正的多行编辑(向上和向下箭头键在行之间移动)
- 多行粘贴,不会破坏缩进或立即执行代码
- 更好的代码完成界面(我们计划进一步改进)
- 可选的鼠标支持
答案 3 :(得分:-1)
如果您正在使用Unix系统进行开发,请使用Sed!
要在将代码粘贴到交互式提示中之前删除所有空行,请使用以下命令:
sed '/^$/d' mysourcefile
Sed是一个流编辑器。这里,它将mysourcefile作为输入,然后将编辑后的文本发送到stdout。将输出复制并粘贴到交互式Python shell中,你应该好好去!
(或者使用Screen将已编辑的源发送到另一个屏幕会话,并打开交互式shell!)