python:忽略前导“>>>”和交互模式中的“...”?

时间:2016-01-18 18:06:16

标签: python ipython interpreter pasting

许多在线python示例显示了具有正常前导“>>>”的交互式python会话和每行前面的“......”字符。

通常,如果没有这些前缀,就无法复制此代码。

在这些情况下,如果我想在复制后将此代码重新粘贴到我自己的python解释器中,我必须做一些工作才能首先剥离这些前缀。

有没有人知道如何让python或iPython(或任何其他python解释器)自动忽略前导“>>>”粘贴在哪一行的“...”字符?

示例:

>>> if True:
...     print("x")
... 

3 个答案:

答案 0 :(得分:5)

IPython会自动为您完成此任务。

In [5]: >>> print("hello")
hello

In [10]: >>> print(
   ....: ... "hello"
   ....: )
hello

答案 1 :(得分:2)

您只需关闭autoindent以在多行粘贴中添加>>>...

In [14]: %autoindent
Automatic indentation is: OFF
In [15]: >>> for i in range(10):
   ....: ...     pass
   ....: 

In [16]: >>> for i in range(10):
   ...: ...     pass
   ...: ... 
In [17]: >>> for i in range(10):
   ...: ...     pass
   ...: ... 

In [18]: %autoindent
Automatic indentation is: ON

In [19]: >>> for i in range(10):
   ....:     ...     pass
   ....:     
  File "<ipython-input-17-5a70fbf9a5a4>", line 2
    ...     pass
    ^
SyntaxError: invalid syntax

或者不要复制>>>,它会正常工作:

In [20]: %autoindent
Automatic indentation is: OFF

In [20]:  for i in range(10):
   ....: ...     pass
   ....: 

答案 2 :(得分:1)

与粘贴到shell中的不完全相同,但doctest模块可能很有用。它扫描python模块或常规文本文件,查找交互式脚本片段,然后运行它们。它的主要用例是混合文档和单元测试。假设你有一个教程,如

This is some code to demonstrate the power of the `if`
statement. 

>>> if True:
...     print("x")
... 
x

Remember, each `if` increases entropy in the universe,
so use with care.

>>> if False:
...     print("y")
... 

将其保存到文件中,然后运行doctest

$ python -m doctest -v k.txt
Trying:
    if True:
        print("x")
Expecting:
    x
ok
Trying:
    if False:
        print("y")
Expecting nothing
ok
1 items passed all tests:
   2 tests in k.txt
2 tests in 1 items.
2 passed and 0 failed.
Test passed.

doctest运行脚本片段并将其与预期输出进行比较。

更新

这是一个脚本,它将获取剪贴板中的内容并粘贴python脚本片段。复制您的示例,运行此脚本,然后粘贴到shell中。

#!/usr/bin/env python3

import os
import pyperclip

pyperclip.copy(os.linesep.join(line[4:] 
    for line in pyperclip.paste().split(os.linesep)
    if line[:4] in ('>>> ', '... ')))