Почему я не могу вставить выходные данные Pythons REPL без ручного редактирования? - PullRequest
4 голосов
/ 15 марта 2009

Огромное количество примеров кода 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):
    ^

Код не работает!? ..

Чтобы запустить его, мне нужно было бы либо ..

  • Скопируйте и вставьте строки по одной, убедившись, что я правильно скопировал все отступы. Если вы все испортили (скажем, пропустили пробел, вы должны начать все сначала)
  • используйте текстовый редактор для удаления >>> и ..., затем вставьте снова

Это не большая проблема, но, учитывая, сколько примеров кода представлено в этом формате, кажется странным, что вы должны это сделать ..

Ответы [ 4 ]

9 голосов
/ 15 марта 2009

Как запустить / принять "вывод Pythons REPL"

  • Использование IPython shell

    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 module

Копировать без приглашения оболочки в первую очередь (хотя я не знаю, как это сделать, например, в Google Chrome).

Почему используется формат doctest

Сохранить следующее в documentation.txt:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. 

>>> 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
>>>

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est
laborum.

Пробег:

$ 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 голосов
/ 15 марта 2009

Я не знаю, есть ли хорошее решение для этого. В идеале, был бы какой-то способ изменить поведение интерпретатора, чтобы он принимал ввод / копирование такого рода. Вот несколько альтернативных предложений:

Используйте тройные кавычки, чтобы сохранить пример в строку. Затем используйте 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 голос
/ 15 марта 2009

«Почему» вопросы редко имеют полезные ответы.

Например, если я сказал, что причина состояла в том, чтобы избежать сложного иска о нарушении интеллектуальной собственности, что это делает? Ничего такого. Вы все еще должны прекратить копировать и вставлять и начать думать и печатать.

Или, например, если бы я сказал, что причина, по которой было дано здесь , нет ничего действенного. Проблема в том, что примеры должны быть напечатаны, а не вырезаны и вставлены. И эта проблема не решается этой информацией.

Действительно, проблема действительно в том, что «я хочу копировать и вставлять, не задумываясь и не печатая, как я могу это сделать?» и ответ тот же.

Вы не можете копировать и вставлять интерактивный сеанс (кроме комментариев doctest). Вы должны напечатать это. К сожалению.

0 голосов
/ 15 марта 2009

Код представлен таким образом, потому что он должен быть пошаговым процессом. Три символа, которые вы видите «>>>», - это символы Python IDE, но, кажется, вы уже это знаете. Когда у вас есть доступ к консоли или оболочке и вы вводите 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.
>>>

Так что принимайте это за образовательный инструмент. :)

...