| Сбор информации |
|
IPython - это немножко больше, чем просто оболочка, в которой можно активно работать. Это еще и инструмент сбора разного рода информации о программном коде и объектах, с которыми приходится работать. Она обеспечивает такие возможности в добывании информации, что с легкостью может рассматриваться как инструмент исследователя. В этом разделе описывается ряд особенностей, которые помогут вам в сборе информации. page Если представление объекта, с которым приходится работать, не умещается на экране, можно попробовать воспользоваться специальной функцией page. Вы можете использовать функцию page для вывода объекта с помощью программы постраничного просмотра. Во многих системах в качестве такой программы по умолчанию используется утилита less, но вы можете использовать какую-нибудь другую программу. Ниже демонстрируется стандартный способ использования:
Здесь в переменной р сохраняется результат выполнения системной команды ps aux. Затем вызывается функция page, которой передается объект с результатами. После этого функция page запускает программу less. Функция page имеет один дополнительный параметр: -r. Этот параметр предписывает функции page передать программе постраничного просмотра неформатированное строковое представление объекта (результат вызова функции str()). Для нашего объекта со списком процессов это могло бы выглядеть так:
Такой неформатированный вывод выглядит почти нечитабельно. Мы рекомендуем начинать с форматированного вывода и работать уже с ним. pdef Специальная функция pdef выводит заголовки определений (сигнатуры функций) любых вызываемых объектов. В следующем примере мы создаем свою собственную функцию со строкой документирования и инструкцией return:
Функция pdef проигнорировала строку документирования и инструкцию return, но вывела сигнатуру функции. Функцию pdef можно использовать с любой вызываемой функцией. Она может работать, даже когда исходный программный код недоступен, но при условии, что имеется доступ к файлу .рус или к пакету. pdoc Функция pdoc выводит строку документирования переданной ей функции. Ниже мы передали pdoc функцию myfunc, которую передавали функции pdef в примере выше:
Результат достаточно очевиден. pfile Функция pfile передает файл, содержащий указанный объект, программе постраничного просмотра, если этот файл будет найден:
В этом примере открывается файл модуля os и передается программе less. Это может оказаться удобным, если вы пытаетесь понять, почему тот или иной фрагмент программного кода ведет себя тем или иным способом. Эта функция не работает, если доступным файлом является пакет или файл с байт-кодом .рус. Ту же информацию, что выводят специальные функции %pdef, %pdoc и %pf ile, можно получить с помощью оператора ??. Причем использование оператора ?? предпочтительнее. pinfo
то можно было бы запросить информацию непосредственно о модуле:
Функция pinfo и родственные ей утилиты настолько удобны, что сложно представить, как можно обходиться без них. Функция pinfo предоставляет такую информацию, как тип, базовый класс, пространство имен и строка документирования. Если представить, что у нас имеется модуль, содержащий следующее: Об определенном классе в этом модуле:
Об экземпляре одного из классов:
Оператор ?, стоящий перед или после имени объекта, позволит получить ту же информацию, которую выводит функция pinf о:
А два знака вопроса (??), помещенные перед или после имени объекта, позволят получить еще больше информации:
Оператор ?? выводит ту же информацию, которую дает функция pinfo, плюс исходный программный код реализации запрошенного объекта. Поскольку в этом примере мы запросили информацию об определенном классе, оператор ?? вывел исходный программный код только для этого объекта, а не весь файл целиком. Эта особенность оболочки IРу-thon используется значительно чаще, чем любая другая ее особенность. psource Функция psource выводит исходный программный код указанного объекта, будь то модуль или элемент модуля, такой как класс или функция. Для отображения исходного программного кода используется программа постраничного просмотра. Ниже приводится пример использования psource для просмотра содержимого модуля:
Ниже приводится пример использования функции psource для просмотра исходного кода класса в модуле:
и в следующем примере функция psource используется для вывода исходного кода функции:
psearch Специальная функция psearch позволяет отыскать объект на языке Python по имени, с возможностью использования шаблонных символов. Здесь мы лишь коротко опишем функцию psearch. Если вам потребуется дополнительная информация о ней, вы можете обратиться к документации по специальным функциям, введя команду magic в строке приглашения IPython и отыскав описание функции psearch в списке, отсортированном по алфавиту. Для начала объявим следующие объекты:
Мы можем отыскать все объекты, имена которых начинаются с символа a, b или с, следующим способом:
Обратите внимание, что помимо наших объектов а, аа, b, bb, с и cc были найдены еще и встроенные объекты. Оператор ? может рассматриваться как приблизительный эквивалент функции psearch. Например:
То есть вместо psearch мы вполне можем использовать *?. Функция psearch имеет дополнительные параметры: -s позволяет включить, а -е - исключить из поиска указанное пространство из относящихся к этой функции пространств имен. В пространства имен входят builtin, user, user_global, internal и alias. По умолчанию функция psearch производит поиск в пространствах имен builtin и user. Чтобы произвести поиск только в пространстве имен user, можно было бы передать функции psearch параметр -е builtin, который исключит из поиска пространство имен builtin. Использование этих параметров несколько неочевидно, но имеет некоторый смысл. По умолчанию функция psearch производит поиск в пространствах имен builtin и user, поэтому, если использовать параметр -s user, поиск по-прежнему будет производиться в пространствах имен builtin и user. В следующем примере мы еще раз выполнили поиск, но на этот раз исключили пространство встроенных имен builtin:
В следующем примере произведен поиск строк:
Кроме того, функция psearch позволяет отыскивать объекты указанных типов. Ниже мы выполнили поиск целочисленных объектов в пространстве имен user: Объекты _ _и_ _, которые были найдены здесь, являются сокращениями IPython. Объект_ _name_ _- это специальная переменная, которая хранит имя модуля. Если переменная_ _name_ _содержит строку '_ _main _ _', это
означает, что модуль выполняется как самостоятель who Оболочка IPython предоставляет множество способов получения списков интерактивных объектов. Первый из них - функция who. Ниже приводится продолжение предыдущего примера с переменными а, аа, b, bb, с и cc и использованием функции who:
Эта функция не содержит никаких подвохов, она просто выводит перечень всех объектов, которые были определены в интерактивном режиме. Функцию who можно использовать для выборки переменных определенных типов, например:
whojs Функция who_ls похожа на функцию who, за исключением того, что она не выводит перечень имен соответствующих переменных, а возвращает список. Ниже приводится пример использования функции who_ls без аргументов:
А в следующем примере производится выборка объектов определенного типа:
Функция who_ls возвращает список имен, поэтому вы можете получить доступ к нему с помощью переменной _, которая содержит «последний выведенный результат». Ниже демонстрируется способ обхода последнего полученного списка с соответствующими именами переменных:
whos Функция whos похожа на функцию who, но в отличие от последней функция whos выводит информацию в табличном виде. Ниже приводится пример использования функции whos без аргументов:
Так же, как и функция who, она способна отбирать переменные в соответствии с указанным типом:
История В оболочке IPython существует два способа получения доступа к истории вводившихся команд. Первый основан на использовании поддержки библиотеки readline, а второй - на использовании специальной функции hist. Поддержка readline В оболочке IPython обеспечивается доступ ко всем функциональным возможностям, которые может предоставить приложение, обладающее поддержкой библиотеки readline. Если вы привыкли пользоваться управляющими комбинациями для выполнения поиска по истории команд в оболочке Bash, значит у вас не будет проблем с использованием той же самой функциональности в IPython. В примере ниже определяется несколько переменных, а затем производится поиск по истории команд:
Здесь мы нажали комбинацию клавиш Ctrl-r, затем ввели строку f о, которая выступает в качестве критерия поиска. В результате была получена строка, которую мы ввели в приглашении IPython In [5]. Пользуясь поддержкой поиска в библиотеке readline, мы вновь нажали комбинацию Ctrl-r и получили строку, которую мы ввели в приглашении IPython In [4]. Есть еще некоторые комбинации клавиш, которые можно использовать при наличии поддержки readline, но мы коснемся их очень кратко. Комбинация Ctrl-a переносит курсор в начало строки, комбинация Ctrl-e - в конец строки. Комбинация Ctrl-f вызывает перемещение курсора на один символ вперед (forward), а комбинация Ctrl-b - на один символ назад (backward). Комбинация Ctrl-d удаляет (delete) один символ под курсором, а комбинация Ctrl-h - удаляет один символ левее курсора (аналогично действию клавиши Backspace (забой)). Комбинация Ctrl-p вызывает перемещение на одну команду назад, к началу истории, а комбинация Ctrl-n - на одну команду вперед, к концу истории. Дополнительную информацию о возможностях readline можно получить в справочном руководстве *nix-систем с помощью команды man readline. Функция hist В дополнение к возможности доступа к истории команд посредством библиотеки readline оболочка IPython также предоставляет для этого свою собственную специальную функцию с именем history и сокращенный вариант имени hist. При вызове без параметров функция hist выводит последовательный список команд, вводившихся пользователем. По умолчанию строки в этом списке пронумерованы. В следующем примере мы определили несколько переменных, перешли в другой каталог и затем вызвали функцию hist:
Четвертый и пятый элементы в списке выше - это вызовы специальных функций. Обратите внимание на то, как они были изменены оболочкой IPython, благодаря чему можно видеть, что в действительности команды выполняются через вызов оболочкой функции magic(). Чтобы подавить вывод номеров строк, можно использовать параметр -п. Ниже приводится пример использования функции hist с параметром -п:
Это очень удобно, когда при работе в IPython возникает необходимость скопировать блок программного кода из оболочки IPython и вставить его в текстовый редактор. Параметр -t возвращает «преобразованное» (translated) представление истории, где показано, как в действительности выглядят команды, введенные в оболочке IPython. Этот параметр установлен по умолчанию. Ниже приводится история команд, которая образовалась к настоящему моменту, полученная с параметром -t:
При использовании параметра -r выводится история команд в «непосредственном (сыром) виде» (raw) и отображаются команды в том виде, в каком они вводились. Ниже приводится результат применения параметра-r:
Параметр -g функции обеспечивает возможность поиска в истории по заданному шаблону. Ниже приводится пример использования параметра -g, чтобы отыскать в истории все вхождения слова hist:
Обратите внимание на слова «shadow history» (теневая история), появившиеся в предыдущем примере. «Теневая история» - это история всех команд, которые вводились когда-либо. Строки с элементами этой истории отображаются в самом начале списка и начинаются с нуля. Строки с элементами истории текущего сеанса отображаются в конце списка и не начинаются с нуля. История результатов И в стандартной оболочке Python, и в оболочке IPython имеется возможность доступа не только к истории вводившихся команд, но к истории результатов. Первый способ доступа заключается в использовании специальной переменной с именем _, которая содержит «последний выведенный результат». Ниже приводится пример использования переменной _ в IPython:
Когда в приглашении In [1 ] мы определили переменную foo, переменная _ в In [2] вернула пустую строку. Когда мы вывели значение переменной foo в In [3], переменная _ в In [4] вернула полученный выше результат. А операция в In [5] показала, что имеется возможность сохранять результат в переменной. Ниже приводится тот же самый пример, выполненный в стандартной оболочке Python:
Здесь, в стандартной оболочке Python, наблюдаем практически ту же самую картину, что и в оболочке IPython, за исключением того, что при попытке обратиться к имени _ до того, как что-нибудь будет выведено, возбуждается исключение NameError. Оболочка IPython поднимает концепцию «последнего выведенного результата» на новый уровень. В разделе «Выполнение системных команд» было дано описание операторов ! и !! и говорилось, что результат работы оператора !! нельзя сохранить в переменной, но позднее его можно использовать. Проще говоря, у вас имеется доступ к любым результатам с помощью символа подчеркивания (_), вслед за которым следует число в соответствии с синтаксисом _[0-9]*. Число должно соответствовать результату в строке Out [0-9]*. Чтобы продемонстрировать, как действует этот прием, мы сначала выведем списки файлов, но при этом ничего не будем делать с полученными результатами:
Теперь у нас должна иметься возможность доступа к Out [1-3] с помощью _1, _2 и _3. Чтобы было более понятно, мы присвоим эти значения переменным с говорящими именами:
Теперь apache_list, tree_list и tests содержат те же элементы, которые были выведены в строках Out [1],0ut [2] и Out [3], соответственно: Обобщим сказанное: в оболочке IPython имеется возможность обращаться к выведенным ранее результатам либо через специальную переменную _, либо через _ с явно указанным номером полученного ранее результата.
Related Articles
Set as favorite
Bookmark
Email This
Hits: 154 Комментарии (0)RSS feed CommentsНаписать комментарий |