2010-06-14 2 views
3

При изучении фрагмента неизвестного кода Python, я иногда врезаться в шаблонПростые способы, чтобы исследовать неизвестный Python API,

varName.methodName() 

.

Чтобы понять, что это, я изучу код больше, найду, где было создано экземпляр varName, найти его тип. Так что, если имяПерем оказывается экземпляр ClassName класса, я бы знал, что имяМетода() является методом ИмяКласса.

Иногда имяПрает == собственных и имяМетода() является методом этого класса, или метод, унаследованным от некоторых другого класса, если текущий класс подклассов некоторых других классов.

Быстрые способы/инструменты, которые могут принимать «methodName» в качестве входных данных, сканировать все установленные модули Python и показывать классы, которые имеют methodName()?

Ближайшая вещь, связанная с этим, я знаю, это ipython. Если я наберу имя класса, то dot ('.'), Затем TAB, он может отображать члены класса. Вместо класса я мог бы использовать имя объекта (который является экземпляром определенного класса), и он тоже будет работать. Как только я выберем имя метода из предоставленных параметров, я могу набрать '?' или '??' и получить некоторую помощь, если есть docstring.

Интересно, может ли ipython выполнить интеллектуальное сканирование, основанное только на строке 'methodName'.

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

Редактировать: по запросу я явно добавляю, что мне хотелось бы найти методы по именам методов не только в файлах исходного кода Python. Некоторые пакеты Python (в особенности PyQt) содержат много .so-файлов, и ipython может выполнять доработки, предположительно импортируя их в первую очередь. Таким образом, обычный текстовый поиск, такой как grep (или даже ctags), не будет делать трюк здесь.

+0

Какой редактор вы используете? Хорошее решение может быть специфичным для редактора. – Brandon

+0

@Brandon Corfman: vim/scite –

+0

Является ли 'grep' сломанным? Каталоги библиотеки Python полностью доступны. –

ответ

3

Вы хотите Exuberant ctags (старые ctags не генерируют теги для Python).

После того, как вы установили (способ сделать это зависит от вашей платформы), запустить его на файлах:

$ /usr/local/bin/ctags *py 

(вы можете запустить его несколько раз, чтобы приобщать тегов в существующий файл тегов, имеют рекурсию подкаталогов и т.д., все с параметрами командной строки), и это делает tags файл, как показано ниже (для краткости я использую один файл Python с один класс, определяющий один метод):

$ cat tags 
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ 
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ 
!_TAG_PROGRAM_AUTHOR Darren Hiebert /[email protected]/ 
!_TAG_PROGRAM_NAME Exuberant Ctags // 
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ 
!_TAG_PROGRAM_VERSION 5.7 // 
Foo a.py /^class Foo(object):$/;" c 
amethod a.py /^ def amethod(self): pass$/;" m class:Foo 

Теперь, цитируя this article:

Пусть говорят, когда вы обнаружите функцию вызов, который вы хотите увидеть определение, просто наведите курсор на , что функции и нажмите Ctrl] и приведет вас туда. Если вы хотите вернуться к тому месту, откуда вы пришли, просто нажмите ctrl t. Вместо ctrl t, I нравится использовать ctrl i и ctrl o to перемещаться вперед и назад от контрольных точек .

Кроме того, контрольно-Р (делают некоторые попытки) завершение кода для идентификаторов, найденных в tags. (:help tags в vim предоставит вам более подробную информацию).

+0

Я только что обновил свой вопрос, как это было предложено в комментариях. Обновление содержит мотивацию (я надеюсь, что это правильно), почему ctags полезен, но не всегда. Извините за то, что я не знаю, когда изначально задаю свой вопрос. Не стесняйтесь обновлять свой ответ, если знаете какие-либо другие трюки, которые могут повлиять на ситуацию после обновления вопроса. Спасибо. –

+0

@jedi, я бы написал простой «адаптер» .so файлов для (поддельных) файлов Python на пути к ctags - создание ctags даже _more_ exhuberant! - и представить его в качестве добавленного пользователем дополнения к ctags (если exhuberant ctags не принимает плагины, а затем просто оберните его!). –

0

Вы можете использовать утилиту pydoc, которая поставляется с большинством версий Python. В Windows это обычно C: \ PythonXX \ Tools \ Scripts \ pydocgui.pyw (где XX - версия Python).

Запуск этого запускает небольшое окно Tkinter с полем поиска. Вы можете искать автоматически созданные документы для всех установленных модулей python или открывать браузер в документации верхнего уровня.

+0

И большинство установок будет иметь pydoc из меню «Пуск» в качестве элемента «Документы модуля» в папке Python XX, если я не ошибаюсь. – JAB

+0

Это то, что я получаю при запуске графического интерфейса tkinter и пытаюсь найти что-либо: http://dpaste.org/p2NH/ –

+0

Обновление: консольная версия «pydoc -k keyword» не создает никаких исключений, но похоже, не может найти имена методов классов из наборов оконных инструментов, таких как Qt и wxPython. –

0

Если вы используете Eclipse с PyDev для вашей IDE, вы можете использовать браузер PyDev Globals. Вы можете искать модули, классы, методы и функции. Нажав на результат, вы откроете исходный файл и переместите курсор в строку, где объект определен.

alt text http://www.michaelfogleman.com/static/images/pydev_browser.png

Вы также можете нажать F3, чтобы перейти к определению переменной, что курсор находится на. Например, если ваш курсор находится на линии, такой как import util, нажатие F3 откроется util.py.

2

Я иногда вставил help(varName) в свой код, так что, когда эта конкретная функция будет запущена, вместо этого появится файл справки. Например, если у меня есть этот код:

def foo(bar): 
    bar.baz() 

и я хочу, чтобы выяснить, что бар класс и что .baz делает, я просто вставить этот

def foo(bar): 
    help(bar) 
    help(bar.baz) 
    bar.baz() 

затем запустить скрипт. Другим способом, который менее инвазивен, является использование print type(bar).

0

Учитывая, что ваш редактор является vim, могу ли я предложить ropevim. Он использует веревку, библиотеку рефакторинга Python. Две функции ropevim - «найти вхождения» и «определение goto». Оба из них помогут вам перемещаться по исходному дереву.

1

Я бы предпринял интерактивный подход, похожий на Ли Райан: запустите сценарий в режиме отладки, установите разрыв в интересующей строке и интерактивно запросите переменную, о которой идет речь.

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

Смежные вопросы