交互式提示处的空行规则

时间:2011-12-05 20:47:12

标签: python command-prompt interactive

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

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

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

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

4 个答案:

答案 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解释器中,那么您需要一组略有不同的规则。

  • 环绕顶级功能和类定义,两个空白 线。
  • 顶级模块代码(在函数或类之外)需要一个空行来结束缩进块,例如for循环,try / except或if语句。
  • 不能在函数,类或方法中使用空行(禁止\或#)。

坚持这些并且你将保留粘贴到解释器的能力。但是,对于某个班级,您不会严格地将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!)