复制并粘贴 Python REPL 示例

问题描述 投票:0回答:4

许多 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):
    ^

要让它运行,我必须......

  • 一次复制并粘贴一行,确保正确复制所有缩进。如果你搞砸了(比如,错过了一个前导空格,你就必须重新开始)
  • 使用文本编辑器删除
    >>> 
    ... 
    ,然后再次粘贴

我还能怎样避免这个问题?

python user-interface read-eval-print-loop
4个回答
9
投票

如何运行/采用“Python REPL 的输出”

  • 使用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 上执行此操作)。

为什么使用doctest格式

将以下内容保存到

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


2
投票

不知道有没有好的解决方案。理想情况下,有某种方法可以修改解释器的行为以接受此类复制/粘贴输入。以下是一些替代建议:

使用三重引号将示例保存到字符串中。然后,使用 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),这对于摆脱那些讨厌的提示非常有效。我相信很多其他编辑也有这个。


1
投票

“为什么”问题很少有有用的答案。

例如,如果我说原因是为了避免复杂的知识产权侵权诉讼,那有什么作用呢?没有什么。你仍然需要停止复制和粘贴并开始思考和打字。

或者,例如,如果我说原因是在这里给出的,那么就没有什么可采取行动的。问题是示例必须输入而不是剪切和粘贴。这个信息并不能解决这个问题。

事实上,问题确实是“我想复制粘贴而不需要太多思考和打字,我该怎么做?”答案是一样的。

您无法复制和粘贴交互式会话(文档测试注释中除外)。你必须输入它。对不起。


0
投票

代码以这种方式呈现,因为它是一个逐步的过程。你看到的三个字符“>>>”是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.
>>>

因此,真正将其视为一种教育工具。 :)

© www.soinside.com 2019 - 2024. All rights reserved.