python: 在交互模式下忽略前导“>>>”和“...”?
python: ignoring leading ">>>" and "..." in interactive mode?
许多在线 python 示例显示交互式 python 会话,每行前都有正常的前导“>>>”和“...”字符。
通常,如果不获取这些前缀,就无法复制此代码。
在这些情况下,如果我想在复制后将这段代码重新粘贴到我自己的 python 解释器中,我必须做一些工作来首先去除那些前缀。
有谁知道让 python 或 iPython(或任何其他 python 解释器)自动忽略前导“>>>”和“...”的方法粘贴的行中的字符?
示例:
>>> if True:
... print("x")
...
IPython 会自动为您执行此操作。
In [5]: >>> print("hello")
hello
In [10]: >>> print(
....: ... "hello"
....: )
hello
您只需关闭 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
....:
与粘贴到 shell 不太一样,但 doctest
模块可能很有用。它扫描 python 模块或常规文本文件以查找交互式脚本片段,然后 运行s 它们。它的主要用例是混合文档和单元测试。假设你有一个教程如
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
运行s 脚本片段并将其与预期输出进行比较。
更新
这是一个脚本,它将获取剪贴板中的内容并粘贴回 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 ('>>> ', '... ')))
许多在线 python 示例显示交互式 python 会话,每行前都有正常的前导“>>>”和“...”字符。
通常,如果不获取这些前缀,就无法复制此代码。
在这些情况下,如果我想在复制后将这段代码重新粘贴到我自己的 python 解释器中,我必须做一些工作来首先去除那些前缀。
有谁知道让 python 或 iPython(或任何其他 python 解释器)自动忽略前导“>>>”和“...”的方法粘贴的行中的字符?
示例:
>>> if True:
... print("x")
...
IPython 会自动为您执行此操作。
In [5]: >>> print("hello")
hello
In [10]: >>> print(
....: ... "hello"
....: )
hello
您只需关闭 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
....:
与粘贴到 shell 不太一样,但 doctest
模块可能很有用。它扫描 python 模块或常规文本文件以查找交互式脚本片段,然后 运行s 它们。它的主要用例是混合文档和单元测试。假设你有一个教程如
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
运行s 脚本片段并将其与预期输出进行比较。
更新
这是一个脚本,它将获取剪贴板中的内容并粘贴回 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 ('>>> ', '... ')))