许多 Python 示例显示为 Python REPL 会话,例如:
>>> class eg(object):
... def __init__(self, name):
... self.name = name
... def hi(self):
... print "Hi %s" % (self.name)
...
>>> greeter = eg("Bob")
>>> greeter.hi()
Hi Bob
>>>
但是,如果我尝试将该代码复制并粘贴到另一个
python
解释器会话中,我会收到错误:
>>> >>> class eg(object):
File "<stdin>", line 1
>>> class eg(object):
^
SyntaxError: invalid syntax
>>> ... def __init__(self, name):
File "<stdin>", line 1
... def __init__(self, name):
^
要让它运行,我必须......
>>>
和 ...
,然后再次粘贴我还能怎样避免这个问题?
使用IPythonshell
In [99]: %cpaste
Pasting code; enter '--' alone on the line to stop.
:>>> class eg(object):
:... def __init__(self, name):
:... self.name = name
:... def hi(self):
:... print "Hi %s" % (self.name)
:...
:>>> greeter = eg("Bob")
:>>> greeter.hi()
:--
Hi Bob
使用功能强大的文本编辑器(例如,
C-x r k
在Emacs中删除矩形区域)使用doctest模块
首先在没有 shell 提示的情况下进行复制(例如,尽管我不知道如何在 Google Chrome 上执行此操作)。
将以下内容保存到
documentation.txt
:
Lorem ipsum dolor sat amet,consectetur adipisicing elit,sed do eiusmod tempor incididunt ut laboure et dolore Magna aliqua。乌恩尼姆广告 Minim veniam,quis nostrud 实习 ullamco labis nisi ut aliquip ex ea commodo consequat。 >>> 类例如(对象): ... def __init__(self, 名称): ... self.name = 名称 ... def hi(自我): ... print "Hi %s" % (self.name) ... >>> 迎宾员 = 例如("鲍勃") >>> 问候语.hi() 嗨鲍勃 >>> Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。例外圣奥卡埃猫库比达特非 Proident,sunt in culpa qui officia deserunt mollit anim id est 劳动。
运行:
$ python -c "import doctest; doctest.testfile('documentation.txt')" -v
输出:
Trying:
class eg(object):
def __init__(self, name):
self.name = name
def hi(self):
print "Hi %s" % (self.name)
Expecting nothing
ok
Trying:
greeter = eg("Bob")
Expecting nothing
ok
Trying:
greeter.hi()
Expecting:
Hi Bob
ok
1 items passed all tests:
3 tests in doctest.txt
3 tests in 1 items.
3 passed and 0 failed.
Test passed.
如果您在模块末尾添加以下代码片段,它将测试其文档字符串中的所有代码:
if __name__=="__main__":
import doctest; doctest.testmod()
QED
不知道有没有好的解决方案。理想情况下,有某种方法可以修改解释器的行为以接受此类复制/粘贴输入。以下是一些替代建议:
使用三重引号将示例保存到字符串中。然后,使用 exec:
>>> def chomp_prompt(s): return '\n'.join(ln[4:] for ln in s.splitlines())
...
>>> dirty = """>>> class eg(object):
... ... def __init__(self, name):
... ... self.name = name
... ... def hi(self):
... ... print "Hi %s" % (self.name)
... ...
... >>> greeter = eg("Bob")
... >>> greeter.hi()
... """
>>> clean = chomp_prompt(dirty)
>>> exec clean
Hi Bob
>>>
我的解决方案不仅全部适合一行(因此您可以轻松地将其复制/粘贴到解释器中),它还适用于上面的示例:D :
>>> s = r'''>>> def chomp_prompt(s): return '\n'.join(ln[4:] for ln in s.splitlines())
... ...
... >>> dirty = """>>> class eg(object):
... ... ... def __init__(self, name):
... ... ... self.name = name
... ... ... def hi(self):
... ... ... print "Hi %s" % (self.name)
... ... ...
... ... >>> greeter = eg("Bob")
... ... >>> greeter.hi()
... ... """
... >>> clean = chomp_prompt(dirty)
... >>> exec clean'''
>>> s2 = chomp_prompt(s)
>>> exec s2
Hi Bob
我的第二个建议是看看 ipython 是否能够为您打开编辑器并在完成编辑后执行您在其中输入的内容:
http://ipython.scipy.org/doc/rel-0.9.1/html/interactive/tutorial.html#source-code-handling-tips
如果您将 emacs 设置为编辑器,我知道它能够删除文本矩形(您可能会猜到命令:M-x delete-rectangle),这对于摆脱那些讨厌的提示非常有效。我相信很多其他编辑也有这个。
“为什么”问题很少有有用的答案。
例如,如果我说原因是为了避免复杂的知识产权侵权诉讼,那有什么作用呢?没有什么。你仍然需要停止复制和粘贴并开始思考和打字。
或者,例如,如果我说原因是在这里给出的,那么就没有什么可采取行动的。问题是示例必须输入而不是剪切和粘贴。这个信息并不能解决这个问题。
事实上,问题确实是“我想复制粘贴而不需要太多思考和打字,我该怎么做?”答案是一样的。
您无法复制和粘贴交互式会话(文档测试注释中除外)。你必须输入它。对不起。
代码以这种方式呈现,因为它是一个逐步的过程。你看到的三个字符“>>>”是Python IDE的字符,但你似乎已经知道了。当您可以访问控制台或 shell 并输入 python 时,您将得到类似的内容。
% python
Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
因此,真正将其视为一种教育工具。 :)