Подтвердить что ты не робот

Сохранить определение функции в ipython

При использовании ipython я часто хочу сохранить определенные функции, определенные мной во время сеанса, например:

In [1]: def func1():
...:        pass
...: 

In [2]: %save func1.py func1
func1 is neither a string nor a macro.

Вместо этого мне нужно выбрать номер строки определения функции из enumerate(_ih) или вручную скопировать и вставить из vim, если у меня есть функция %edit 'd.

Есть ли способ достичь %save func1.py func1? Я чувствую, что это должно быть возможно, поскольку ipython имеет доступ к определению при использовании% edit.

Edit

Сохранение на основе строки не работает, если в какой-то момент я отредактировал функцию с помощью %ed. В этом случае я ищу способ сохранить новое определение функции.

4b9b3361

Ответ 1

Вы можете сохранить содержимое строки 1 с помощью %save, используя:

In [2]: %save func1.py 1
The following commands were written to file `func1.py`:
def func1():
    pass

Справка по %save доступна с помощью

In [2]: %save?
Type:       Magic function
...
Docstring:
Save a set of lines or a macro to a given filename.

Usage:
  %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...

Вы можете %edit тело функции с помощью:

In [3] %edit func1
 done. Executing edited code...

После %edit -используя вашу функцию func1, вы можете получить следующий вывод из IPython с помощью _:

In [4]: _
Out[4]: 'def func1():\n    print "Hello World"\n\n'

Затем вы можете определить или переопределить %macro с обновлением содержимого func1 следующим образом:

In [5]: %macro new_func1_macro _
Macro `new_func1_macro` created. To execute, type its name (without quotes).
=== Macro contents: ===
def func1():
    print "Hello World"

Наконец, вы можете сохранить новую версию func1 с помощью %save и нового %macro следующим образом:

In [6]: %save func1.py new_func1_macro
The following commands were written to file `func1.py`:
def func1():
    print "Hello World"

Надеюсь, что это прояснится.

Ответ 2

 In [1]: def a():
   ...:     print('hello')
   ...:     return

In [2]: from inspect import getsource

In [3]: %save a.py getsource(a)

The following commands were written to file `a.py`:
def a():
    print('hello')
    return

Ответ 3

Для меня самым простым способом из ipython является вызов:

%edit foo

Тогда в vim do:

:saveas directory/name.py
:x

Таким образом вы получаете копию для себя. Если вы хотите сбросить его в определенный файл, используйте vim's

:read directory/file

чтобы импортировать содержимое.