Pull to refresh

IPython advanced usage

Reading time 4 min
Views 13K
Данный инструмент знаком большинству разработчиков на Python.
В тоже время, не так много людей подозревают о раширенных возможностях предоставляемых данной интерактивной оболочкой, пользуясь в основном автодополнением.

Terminal 2014 python 2014 125ճ0image

Статья построенна на выдержках из обширной, понятной и красивой документации ipython.github.com/ipython-doc/dev/interactive/index.html
Пропустим такие явные вещи, как автодополнение и история команд, сохраняемая мыжду вызовами.


Обзор объектов


In [1]: import datetime
In [2]: datetime?
Type: module
Base Class: <type 'module'>
String Form: <module 'datetime' from '/usr/local/Cellar/python/2.7.1/lib/python2.7/lib-dynload/datetime.so'>
Namespace: Interactive
File: /usr/local/Cellar/python/2.7.1/lib/python2.7/lib-dynload/datetime.so
Docstring:
Fast implementation of the datetime type.


Как видим, мы получаем достаточно подробную информацию о объекте, что может пригодиться при отладке. В наличии также специальные команды %pdoc, %pdef, %psource и %pfile, которые помогут нам увидеть документацию, определение функции, исходный код и полный код файла соответственно.

Пример вывода команды %pdef для json.dumps:

In [8]: %pdef json.dumps
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, **kw)


Команда %run


Используя данную команду мы имеем возможность выполнить любой python скрипт и получить доступ к всем его данным непосредственно в пространстве интерактивной оболочки.

Это черезвычайно полезно, когда мы разрабатываем некоторый модуль и хотим иметь возможность тестировать и манипулировать с его данными удобным способом.

Имеется некоторый набор ключей, позволяющих замерить время выполнения (-t), запустить с отладчиком (-d) или профайлером (-p).

Если необходимо освежить в памяти информацию о магических командах, предоставляемых IPython, всегда можно воспользоваться подсказкой (%run?).

Кеширование результатов вывода


При использовании IPython каждый ввод и вывод имеет метку.

In [11]: a = 9
In [12]: a
Out[12]: 9


Это радужно, так как мы можем обращаться с выводом без необходимости присваивать его конкретной переменной. Для этого мы используем синтаксис _номер_метки или же просто _, __ и ___, для обращения к 3 последним выводам:

In [13]: _
Out[13]: 9
In [14]: _ + 8
Out[14]: 17
In [15]: _
Out[15]: 17
In [16]: _13
Out[16]: 9


Подавление вывода


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

In [21]: "*"*100500;
In [22]:


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

История ввода


Существуют 2 команды, позволяющие просматривать и манипулировать историей введенных строк: %hist и %rep

In [22]: %hist
1 : import datetime
2 : import json
3: a = 9
4: a
In [23]: %rep 1
In [24]: import datetime<- курсор остановится на данной позиции и будет ожидать нашего ввода.


Вызов системных команд без выхода из оболочки


Используя команды ! и !!, можно выполнять команды системной оболочки, такие как ls, cd и другие. Различие между командами в том, что первая просто выполняет системную команду, вторая же в добавок позволяет получить и спользовать вывод этих команд.

In [26]: !ls
Archive Development Downloads Library Music Pictures VirtualBox VMs
Desktop Documents Dropbox Movies My Projects

In [27]: !!ls
Out[27]: SList (.p, .n, .l, .s, .grep(), .fields(), sort() available):
0: Archive
1: Desktop
2: Development
3: Documents
4: Downloads
5: Dropbox
6: Library
7: Movies
8: Music
9: My
10: Pictures
11: Projects
12: VirtualBox VMs


Многострочное редактирование


IPython умеет распознавать выражения, требующие нескольких строк, потому с этим нет особых проблем, но есть куда расти. Команда %edit сделает вашу жизнь лучше и позволит не избегать определений функций и классов прямо в интерактивной оболочке.

Введя команду %edit IPython откроет нам системный редактор, где мы сможем редактировать наш код, привычным способом.

In [28]: %edit
IPython will make a temporary file named: /var/folders/9Q/9Q8AwQvdEUubQ84MwFcKt++++TI/-Tmp-/ipython_edit_YPjrQx.py
Editing... done. Executing edited code...
Out[28]: 'def amicool():\n\treturn True\n'
In [29]: amicool()
Out[29]: True
In [30]:


Имеется возможность отрыть редактор с ранее введенным кодом, для этого служит команда %edit -p
Для обращения к ранее редактируемым кускам кода мы можем использовать синтаксис %edit _номер_вывода, в нашем случае это эквивалентно %edit _28.

Просмотр созданных идентификаторов


Я просто оставлю это здесь:

In [32]: %who
a amicool datetime json

In [33]: %whos
Variable Type Data/Info
--------------------------------
a int 9
amicool function <function amicool at 0x1014f2848>
datetime module <module 'datetime' from '<...>lib-dynload/datetime.so'>
json module <module 'json' from '/usr<...>on2.7/json/__init__.pyc'>

In [34]:


Замер времени выполнения кода


Используя простую команды %time и %timeit мы имеем возможность замерять производительность отдельных кусков кода:

In [45]: %timeit [1,2,3,4,5][2]
1000000 loops, best of 3: 236 ns per loop

In [46]: %timeit (1,2,3,4,5)[2]
10000000 loops, best of 3: 34.3 ns per loop

In [54]: %time [1,2,3,4,5][2]
CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
Wall time: 0.00 s
Out[55]: 3




Еще раз напоминаю ссылку на документацию, ipython.github.com/ipython-doc/dev/interactive/index.html, где есть множество интересных возможностей, не освещенных в данной скудной статье.image
Tags:
Hubs:
+62
Comments 15
Comments Comments 15

Articles